トップ 一覧 検索 ヘルプ RSS ログイン

独り言日記(2009/09)の変更点

+!!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でしたけど、、、この挙動は違和感を感じる、、、。
+時間があればバイナリからの逆アセンブルで追いかけた方がよさそうですが、たまに詰め物しないと動作不安定とか上記のようなコードで通るはずのルートを通らないとか、起こりえるんだよなぁ。
+ごくごくまれに、コンパイラが正しくない結果を出す、ってこともあるということで。
+