Starbug1 1.3.14 リリースのお知らせ
2010/06/17
Starbug1は、軽量、高速なバグトラッキングシステム(BTS: Bug Tarcking System)です。
C で書かれているため少ないリソース(例えば10年前のパソコンなど)でも快適に動作します。
公式サイト http://starbug1.sourceforge.jp/
Sourceforge.jp http://sourceforge.jp/projects/starbug1/
Starbug1 1.3.14 をリリースしました。主な変更内容は以下です。
- id:argius さんから貰ったパッチを取り込みました。boolが宣言されている場合は、再定義しないようにしました。ありがとうございます。
- 64bit環境でコンパイルすると発生するバグを修正しました。
- これにより、今までは64bit環境でも32bitバイナリを生成していたのを、64bitバイナリを生成するように修正しました。
- チケット一覧の投稿日時、最終更新日時の分の桁が表示されない場合がある不具合を修正しました。
64bit環境で表面化したバグの内容
64bit環境で、普通にコンパイルしたバイナリが、実行時に、sqlite3_prepare呼び出し時にエラーが発生する問題があったのですが、今回調査してみたところ非常に情けないバグでした。
プロトタイプ宣言で引数無しで宣言していた update_elementsという関数ですが、
void update_elements();
実装では、Database*を引数に取るようになってました。
void update_elements(Database* db) {
...
で、関数を呼び出すところでは、引数無しで呼び出してたorz.
db_begin(db_a); update_elements(); db_commit(db_a);
プロトタイプ宣言で、引数無しで宣言してるから、本当は必要な引数を指定せずに呼び出してもコンパイル時のエラーにはならなかったということらしい。情けなさすぎるバグ。プロトタイプ宣言怖い。
データベースハンドラ渡さずに、なんで32bit版は、正常に動作してたんだ???
直前の関数呼び出しがdb_begin(db_a)なので、update_elementsを実行する際に、db_beginでスタックに積んだdb_aが運良く読まれていたということだろうと解釈しました。なんという綱渡り。
で、次に湧いてくる疑問。64bit環境では、再現するという理由については、わかりませんでした。
怖くなったので、プロトタイプ宣言は、全体的に見直しました。
最新版をMacOSXでビルドして
問題ありませんでしたのでお知らせします。