g++ -fstrict-aliasing

http://gcc.gnu.org/onlinedocs/gcc-4.0.3/gcc/optimize-options.html#index-fstrict_002daliasing-511

int i = 10;
float f = *( (int*)&i );

は移植性が低いだけでなく、GCC4の最適化

  • O2
  • O1 -fstrict-aliasing -fschedule-insns

によって意味が変わる。

訂正版

union int_float {
	int   as_int;
	float as_float;
}
int_float x;
int i = 10;
x.as_int = i;
float f = x.as_float;	

g++ 4.x はデフォルトでこの問題を起こす最適化が有効になっている。
g++ 4.0.3 はそれにもかかわらず、警告を出さない。

対処:
1) g++3 を使う
2) g++ 4.1 以降でコンパイルして問題箇所を見つけ、修正する