コンパイル時に引数のNULLを警告させる関数を書けたのですが、警告を出した上で
実行時にも変数がNULLか判定させようとすると、判定に失敗してしまいます…
コンパイルオプションで強めの最適化(-O2)をしたときにだけ失敗します。
一体どうなっているんだろう?


ttp://ja.pastebin.ca/1795229

上記のソース(test.c)を
$ gcc -Wall -O2 test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡していても-1を返さずエラーを検知できません。
mainが正常終了してしまいます。

一方、コンパイルする際に最適化オプションを"-O"にすると検知できました。
$ gcc -Wall -O test.c -o test
とコンパイルして実行すると、my_funcにNULLを渡すと-1を返します。
最適化オプションなしでも同じように検知できました。


コンパイルオプションでなぜ挙動が変わるんだろう… "-O2"の何がいけないのだろうか?
実用的には、弱い最適化オプション(-O)でコンパイルすれば済むんですが気になっています。
もう少し詳しい原因が分かる方いらっしゃれば教えて欲しい…

gcc-4.3.2とglibc-2.7を使っています。