コンパイラによる最適化の落とし穴

いやー悩んだ。
DXRubyExtensionの動作確認をしてたところ、どーにも点オブジェクトが矩形オブジェクトに化ける。
dfree(解放時にGCから呼ばれる解放関数のポインタ)を使ってクラスをチェックしているのだが、定数のはずなのに値がおかしい。


release_CollisionPointが点の解放関数で、release_CollisionBoxが矩形の解放関数で、やってることはメモリの解放のみ。
この関数の中にprintfを入れるとちゃんと呼ばれていることが確認できるどころか現象が消える。
現象が出ているときに判定してるとこでdfreeの値をprintfすると同じ値が出てくる。
現象が消えているときはちゃんと違う値になっている。


ということで原因は、コンパイラの最適化により、引数で渡されたポインタをfreeしてるだけの関数が、同じものにまとめられてしまっているのだ。
見た目、引数の型が違うが、コードとしては同じものが出ているから。


こういうハマりかたするとは思わなかった。
っていうかこれ、一見チェックできているように見えるDXRubyのクラスチェックも危ないってことか?
いや、あっちはクラスごとに全然違う関数になってるから大丈夫か。
最適化オプションをどれか外せばいいんだろうけど、こんなのどのオプションでやってるんだろ。
っていうかO2つけただけで勝手にまとめてくれるみたいだなこれ・・・
ひどい話だ。
コード側で対策するしか無いのかー