2012-05-20 101 views
2

這個程序更多的警告與-Os

int main() 
{ 
    int a, b; 
    a = b; 
    return 0; 
} 

,如果你有

g++ -Wall test.cpp

編譯不過,如果你對的優化編譯它編譯沒有警告或錯誤,即使在相同警戒級別

g++ -Wall -Os test.cpp

然後它會開始抱怨你正在使用未初始化的變量!
(注意:實際的程序稍微長一些,並沒有像這個小例子那樣清楚地暴露問題)。

我試過用谷歌搜索,但是我沒有使用正確的搜索條款,或者這不是已知的現象。無論如何,我的問題基本上都是

  • 爲什麼編譯器會給這個警告提供-Os但是不與-O0,即使在相同的警告級別? (如果有的話,我希望它是這個小例子的另一種方式,因爲變量可以完全優化,然後問題就會消失。)
  • 是否有任何其他編譯器選項會觸發意外警告喜歡這個?由於我有興趣使我的程序無bug,我喜歡看到它們全部!
  • 這是一個已知的特色嗎?如果是這樣,我在哪裏可以找到它?我確實嘗試搜索。
  • 或者這只是我的特定版本的編譯器(gcc 4.3.2-1.1,Linux,32位)中的一個小故障?
+0

我* *在最近的各種GCC版本中使用您的第一編譯行獲取警告,請參閱答案bel流。 – juanchopanza

+0

你有一個設置的地方默認的O級別2或更高?如果您手動輸入-O0,會發生什麼情況?否則,也許我的gcc版本只是過時了。但是,這是我的存儲庫附帶的版本...我知道,我對一個新系統已經過期了。 –

+0

我明確使用了'-O0'。 – juanchopanza

回答

3

編譯器需要執行額外的檢查才能執行某些優化,這會導致它發出額外的警告。在An Introduction to GCC的相關章節有一個簡短的解釋。

順便說,在我的平臺(32位在x86的ubuntu 12.04)代碼生成警告用gcc 4.6.3,4.7.0 GCC並用一個gcc 4.8快照:

uninitialized.cpp:在函數'int main()'中: uninitialized.cpp:3:9:warning:變量'a'設置但未使用[-Wunused-but-set-variable] uninitialized.cpp:4:10:warning:' b'在此函數中未初始化使用[-Wuninitialized]

+0

謝謝。該頁面至少會說「只有在程序編譯時使用優化,才能運行數據流分析。」所以我知道這不僅僅是我。但這並不能解釋爲什麼。爲什麼編譯器不進行數據流分析而沒有進行優化? –

+0

@MrLister我想這是一個優化。爲什麼花時間做一些事情,如果不需要?另一方面,人們會期望'-Wall'來掩蓋這一點。不幸的是,我不能重現這個問題,以便弄清楚警告所需的標誌組合。 – juanchopanza

+0

我不同意「如果不需要」部分。這是必需的!在上面的程序中,無論您是否使用優化進行編譯,它都是一樣糟糕的錯誤,而且結果相同。 –

1

有了較高的優化級別編譯通知,你是不等同初始化的變量。所以警告。

+0

你確定這是它嗎?我的意思是,WALL包括-Wuninitialized和-Wmaybe-未初始化。也許我應該閱讀這些。 –

+0

@mrlister:我同意你的意見 - 牆開關 - 可能未初始化和初始化。但是我在等待兩個未初始化的變量時正在討論警告。 –

+0

但顯然,這就是發生了什麼。看到j​​uanchopanza的答案,更多解釋。但不是原因。 –