+!!XCodeビルドでの怪しい結果になった部分(2009/09/30)
+
+MacのXCodeにてプログラムしていて、袋小路に陥った箇所を覚え書き。
+
+ #define KEY_SPACE 0x01
+ #define KEY_SHIFT 0x02
+
+ int foo(const int keyFlag)
+ {
+ int mode;
+
+ mode = 0;
+ if(keyFlag & KEY_SPACE) {
+ mode = 1;
+ if(keyFlag & KEY_SHIFT) {
+ mode = 2;
+ }
+ }
+ return mode;
+ }
+
+としたときに「foo(KEY_SPACE);」を呼ぶと戻り値は何が返ってくるでしょうか?
+結果は「1」のはずですね、ところが呼んだタイミングがいけなかったのか、
+「0」が返ってくる結果に。
+ソースの流れを変えてもコンパイラの最適化を無効にしても変わらず。
+
+結局、
+
+ int foo(const int keyFlag)
+ {
+ int mode;
+
+ mode = 0;
+ if(keyFlag & KEY_SPACE) {
+ mode = 1;
+ if(keyFlag & KEY_SHIFT) {
+ mode = 2;
+ }
+ }
+
+ // 再度判定
+ if(keyFlag & KEY_SPACE) {
+ mode = 2;
+ }
+
+ return mode;
+ }
+
+とすることで正しい結果が得られました。もちろん、Windowsでは1つめのでOKでしたけど、、、この挙動は違和感を感じる、、、。
+時間があればバイナリからの逆アセンブルで追いかけた方がよさそうですが、たまに詰め物しないと動作不安定とか上記のようなコードで通るはずのルートを通らないとか、起こりえるんだよなぁ。
+ごくごくまれに、コンパイラが正しくない結果を出す、ってこともあるということで。
+