2016-11-30 36 views
0

執行下面的代碼運行到「!!!」當編譯器進行優化時:使用編譯器優化時的瘋狂行爲

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

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

編譯器:IAR Studio 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;」的行。

我跑進是相當有關未初始化的變量(函數之外的),該優化過程中是不會自動設置爲零的問題。

除了在調試器中的奇怪行爲,該功能是正確的。不幸的是,這個觀察導致了一個錯誤的解釋。