最適化の不具合!?
VC++で稀に全く予期しないハングに見舞われる時が有る…。
デバッグだと動くがリリースだとハングアップする場合
確保したメモリー外へのアクセスだったりするのが殆だが…
それ以外だと最適化のバグだったりする…。
今まで問題なく動作した関数内で発生するので性質が悪い…。
勿論、最適化を「実行速度」から「デフォルト」などに変更する事で対応可能だ。
この設定は、プロジェクト全体に対してもファイルに対しても可能だが…
でも、負けた気がする!
もっとも「#pragma optimize」で関数毎に最適化を制御する事も…
それでも、負けた気がする!
「volatile」で最適化を制御する手もあるが引数に使用すると
>n 番目の引数を 'unsigned char *volatile ' から
>'unsigned char *& ' に変換できません。
>変換で修飾子が失われます。
なんてエラーが…。
…
リリースで速度優先が設定できないのは、困り者だ。
場合によるが…
「volatile」の変わりに「static」を付けると上手く行く場合が有る。
取り敢えず自分の場合には、これで回避できた。
今回、ファイルを読み込む関数の内部でエラーが発生した。
extern BOOL FileLoad(LPSTR Name,LPBYTE&Buffer,DWORD&Size);
内部の変数に「static」を付ける事で回避可能だが
呼び出し側の変数に「static」を付ける事でも回避できた…。
LPBYTE Buffer;
FileLoad(Name,Buffer,Size)
を
static LPBYTE Buffer;
FileLoad(Name,Buffer,Size)
にする事で回避できたと言う事は、スタックに積むのを
とっちっていたようだ…。
実際にマシン後語を見ると
…
良く分からん!(爆)
まあ、プログラムとは、そう言うものさ!(笑)
まあゴクゴク稀なので遭遇しない人も居るだろう。
でも、遭遇すると結構不幸喰らいます…。
少なくとも自分は不幸になりました…。(泣)
| 固定リンク
コメント