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)