2016-11-30 4 views
0

"!!!"次のコードの実行が実行されます。コンパイラが最適化されている場合:コンパイラ最適化を使用したときの狂った動作

int test() 
{ 
    volatile uint32_t flag = 0; /* volatile doesnt matter */ 

    flag = 3; 
    if (flag == 0) 
    { 
     return 0; // !!! 
    } 
    else 
    { 
     return 1; 
    } 
} 

コンパイラ:IARスタジオCコンパイラ;プラットフォーム:SAM4Cマイクロコントローラ。中レベルの最適化

もちろん、これは既に元の問題が煮詰まったコードです。私は...コンパイラはここでやっていること一方

を理解することはできません

、これは期待通りに動作します:

int test() 
{ 
    volatile uint32_t flag = 0; /* volatile doesnt matter */ 
    int result = 0; 

    flag = 3; 
    if (flag == 0) 
    { 
     result = 0; 
    } 
    else 
    { 
     result = 1; // !!! 
    } 
    return result; 
} 
+0

謎のように見えますが、asmに手がかりがありますか? – harold

答えて

0

私はいくつかのより多くの時間を費やしたと観測され、機能が実際に戻っていること1、デバッガは "return 0;"の行で停止します。

私が遭遇した問題は、むしろ最適化中にゼロに設定されていない初期化されていない変数(関数外)に関連していました。

デバッガの奇妙な動作とは別に、この関数は正しいです。残念なことに、その観察は誤解を招いた。

関連する問題