不幸的是,我現在沒有使用開放代碼,所以請考慮這是一個純理論性質的問題。 我正在使用的C++項目似乎受到以下選項的影響,至少GCC 4.3-4.8導致了相同的問題,沒有注意到3.x系列的任何問題(這些選項可能還沒有存在或者在那裏工作不同),受影響的是Linux x86和Linux ARM平臺。選項本身會自動與O1或O2級別設置,所以我必須找到了第一個什麼選項,使其:gcc編譯器優化受影響的代碼
樹支配,選擇採用
樹DSE
樹FRE
樹前
GCSE
CSE跟隨跳動
它不是我自己的代碼,但我必須維護它,所以我怎麼可能找到這些選項所產生的麻煩來源。一旦我使用「-fno」禁用上述優化,代碼就可以工作。 另一方面,該項目在Visual Studio 2008,2010和2013中完美地工作,沒有任何明顯的問題或特定的編譯器選項。誠然,代碼不是100%的跨平臺,所以有些部分是Windows/Linux特定的,但即使如此,我想知道這裏發生了什麼。 這不是重要的問題,因爲我可以使代碼完美無瑕地運行,但我仍然對如何查找這些問題感興趣。
因此,要簡短:如何識別和查找受影響的代碼?
我懷疑這是一個巨大的海灣合作委員會的錯誤,也許甚至沒有真正解決我正在使用的代碼,但它對我來說真的很感興趣。 我認爲這些選項中的大多數都是某種形式的消除,我也閱讀了這些解釋,但我不知道如何從這裏開始。
您可以隔離出現問題的特定代碼位置,例如啓用優化時返回意外值的特定函數嗎?然後,您可以比較兩種情況下生成的彙編代碼(使用'gcc -S')來查看編譯器生成的不同指令。無論如何,如果您可以創建一個能夠再現問題的[SSCCE](http://sscce.org),以便我們驗證它(即使您的代碼已關閉,您可以將其縮小到一個功能,顯示問題) –
* *你的代碼如何工作?它會開始崩潰嗎?它表現糟糕嗎?它會產生意外的結果嗎?你*做*建立了許多警告啓用,並已妥善解決所有警告(不只是拋棄一些東西)?你確定你的代碼中沒有錯誤或未定義的行爲?你是否檢查過生成的程序集並將其與未經優化生成的程序集進行比較?也許這不是特別的這些優化,而是與導致問題的其他優化相結合? –
醫生,醫生,當我把自己打在頭上的時候會很痛......所以,停止使用優化代碼的方法。在你確定了錯誤並將其報告給GCC維護人員並且他們已經修復之前,請不要使用那些不起作用的東西。但我認爲約阿希姆有一個重要的觀點 - 你確定代碼是乾淨的,沒有任何未定義的行爲嗎? –