« グラフ | メイン | テンプレートのインライン展開と最適化 »

2007年08月13日

ツール開発メモ:: C++Builder 2007 Update 2

    

C++Builder 2007 Update 2 が公開されていた。
これによって致命的な不具合が解決される。
例えば以下の二つ。
----
-O1 もしくは –O2 オプションを使用したときにコンパイラがスタックポインタを破壊する。また、最適化を行うべき状況で、コンパイラが最適化しない場合に比べて遅く、肥大した不要なコードを追加する
プライベートの複数のTRect フィールドを持つDelphiコンポーネントを使用したときにC++コンパイラがTRect 構造体のオフセットアドレスのミスマッチを起こす
----
なんというか、これらのバグのせいですごい悩んだんですが。

C++Builder 6 で作っていたツールを 2007 に持ってきて、プロジェクト変換してエラーがきつくなった所を直して、ビルド通って動いたと思ったら、特定の操作でアクセス違反で落ちる。
起動はしてある程度使えるんだけど、落ちる箇所があってまともに動かない。
落ちるところは直した箇所とは別で、C++Builder 6 で作っていたツールはそれなりに使っていたので、不具合とは考えづらかったが、潜在不具合かと思って追った。

落ちる箇所はリストが空のときに std::find( begin(), end(), a ) みたいにやっているところ。
デバッガで追うと、空のリストなのに begin() != end() で、begin() のアドレスにアクセスして落ちてる。
あれ? list が空の時って、begin() == end() じゃなかったっけ? と言うか、今までそのつもりでいつも書いていて何も問題起きなかったが、正確な仕様は把握していなかった。
で、少し調べるも空のときの begin() が返すイテレーターについての記述が見付からなくて、ソースを見ることにした。
見ると同じになりそうなのだが・・・

そこで、確か同じ dinkumware のSTLを使っている VC2005 のソースを見ると、少し違う。
なんかちょっとチェックが増えてる。
で、VC で簡単なソース組んで動かして見ると問題なし。
じゃ、Builder の STL かなと同じように組んで動かすと問題なし。
あれ?
ちゃんと動いた。と言うことは、自分が書いたソースがまずいのか?
メモリ破壊でもしているんだろうか?
今まで普通に使えていたんだが。
で、自分のソースを追うもよくわからない。
どうしたものかと落ちる箇所をデバッガで何度も動かしているとおかしなことに気付いた。
end() の返すイテレーターが指しているアドレスが毎回変わってる。
何かおかしい。

C++Builder 6 のプロジェクトをコンバートせずに 2007 で作って、ソースを追加してビルドして見る。
ちゃんと動いた!
なんだ、プロジェクトのコンバーターがおかしいのか。
が、共有ライブラリを使わないようにしてビルドしたらやっぱり落ちる orz
リンカが悪いのか?
仕方ないので、共有ライブラリを使うようにして、リリースビルド。
そしたら落ちる。デバッグでは落ちない。
使えないじゃないか!
もしかしたら設定で回避できるかと試行錯誤するも回避できず。
2007 使えない。。。パッチ出るまで待とうと思った。

で、今日。
なんとか回避する方法あるんじゃないかと再びトライ。
起動するとアップデートがあるとか出た。
もしかして!
アップデートしてビルド。
直った。
普通に動く。
当たり前のことがうれしい。
良かった。
でも、自分の中で C++Builder 2007 の信頼性がかなり落ちた。
もう、普通に使っても大丈夫かなぁ。



投稿者 Takenori : 2007年08月13日 23:02




comments powered by Disqus
Total : Today : Yesterday : なかのひと