VC++ オプティマイザのバグ
不具合の原因を探していたら、とんでもないところに原因があった。
VC++のオプティマイザのバグだ。
とある通信関数の戻り値はintでとりうる値は0x00〜0xFFと-1:通信エラー,-2:タイムアウトだ。
ところが、オプティマイザは勝手にBYTEにまとめ、-1は0xFF,-2は0xFEになっている。
そのため、以下のif文が引っかからず、そのまま素通りしている。
int ch = receiveByte(); if (ch < 0) { return rc; }
これを見つけるのに相当苦労しました。
中途半端に賢いから性質が悪い。
解決方法は、#pragma でオプティマイザを無効にしました。
#pragma optimize("", off) ... #pragma optimize("", on)