我正在用包含圖形文件解析器的C++/Qt編寫程序。我使用g++
編譯該項目。在開發過程中,我經常比較不同編譯器標誌之間關於優化和調試信息以及Qt調試標誌(打開/關閉qDebug()和Q_ASSERT())的低級別解析器層的性能。編譯器優化使程序崩潰
現在我面臨一個問題,其中唯一正確運作的版本是沒有任何優化。所有其他版本,即使是-O1
,似乎都以另一種方式工作。他們由於不滿意的斷言而崩潰,當編譯時沒有-O...
標誌時,它們得到滿足。該代碼不會產生任何編譯器警告,即使使用-Wall
。
我很確定我的程序中有一個錯誤,這似乎只對啓用優化有害。問題是:即使在調試程序時我也找不到它。解析器似乎從文件中讀取錯誤的數據。當我運行一些簡單的測試用例時,它們運行得很完美。當我運行一個更大的測試用例(一個直接從文件讀取的圖上的路由計算)時,文件中有一個不正確的讀取,我無法解釋。
我應該從哪裏開始追蹤這種未定義行爲的問題? 這種不同的行爲可能涉及哪些優化方法?(我可以一個接一個地啓用所有的標誌,但我不知道那麼多的編譯器標誌,但是我知道它們有很多,所以這將需要很長時間。)只要我知道哪種類型的錯誤是,我相信我遲早會發現它。
如果你能告訴我哪種編譯器優化方法可能成爲這類問題的候選者,你可以幫助我很多。
聽起來像某處的未定義的行爲。 – 2012-07-11 00:17:28
@ R.MartinhoFernandes是的,但我怎麼找到它?也許使用valgrind? – leemes 2012-07-11 00:18:08
是的,valgrind會警告你未經初始化的值。 – MatijaSh 2012-07-11 00:22:32