2015-06-03 61 views
0

不幸的是,我現在沒有使用開放代碼,所以請考慮這是一個純理論性質的問題。 我正在使用的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特定的,但即使如此,我想知道這裏發生了什麼。 這不是重要的問題,因爲我可以使代碼完美無瑕地運行,但我仍然對如何查找這些問題感興趣。

因此,要簡短:如何識別和查找受影響的代碼?

我懷疑這是一個巨大的海灣合作委員會的錯誤,也許甚至沒有真正解決我正在使用的代碼,但它對我來說真的很感興趣。 我認爲這些選項中的大多數都是某種形式的消除,我也閱讀了這些解釋,但我不知道如何從這裏開始。

+2

您可以隔離出現問題的特定代碼位置,例如啓用優化時返回意外值的特定函數嗎?然後,您可以比較兩種情況下生成的彙編代碼(使用'gcc -S')來查看編譯器生成的不同指令。無論如何,如果您可以創建一個能夠再現問題的[SSCCE](http://sscce.org),以便我們驗證它(即使您的代碼已關閉,您可以將其縮小到一個功能,顯示問題) –

+3

* *你的代碼如何工作?它會開始崩潰嗎?它表現糟糕嗎?它會產生意外的結果嗎?你*做*建立了許多警告啓用,並已妥善解決所有警告(不只是拋棄一些東西)?你確定你的代碼中沒有錯誤或未定義的行爲?你是否檢查過生成的程序集並將其與未經優化生成的程序集進行比較?也許這不是特別的這些優化,而是與導致問題的其他優化相結合? –

+2

醫生,醫生,當我把自己打在頭上的時候會很痛......所以,停止使用優化代碼的方法。在你確定了錯誤並將其報告給GCC維護人員並且他們已經修復之前,請不要使用那些不起作用的東西。但我認爲約阿希姆有一個重要的觀點 - 你確定代碼是乾淨的,沒有任何未定義的行爲嗎? –

回答

2

首先:嘗試使用調試器。如果程序崩潰,請檢查回溯尋找錯誤功能的位置。如果程序行爲異常(輸出錯誤),您應該能夠通過仔細放置斷點來判斷它發生的位置。

如果它沒有幫助,並且項目很小,您可以嘗試使用「-fno」選項編譯項目子集,以防止程序被誤操作。你可以蠻力的方式來找到錯誤的.c​​pp文件的最小子集,並從那裏開始工作。注意:找到一個複雜度很高的搜索算法可以爲您節省很多時間。

如果有任何機會,有一個錯誤的.c​​pp文件,那麼你可以進一步將其內容分成幾個.cpp文件,以查看哪些功能是錯誤行爲的原因。

+0

二進制搜索FTW! –

+0

它不會崩潰,「只有」行爲不端,所以我沒有任何具體的使用調試器,這是一個非常大的項目,所以我需要一個地方先開始。 – Gnampf

+0

開始的好地方是你首先注意到不當行爲的地方。看看它出現在哪個函數中,檢查它的參數是否正確,如果是這種情況 - 函數本身是錯誤的。如果參數不正確,請找到調用它的函數。沖洗並重復。假設你沒有太多的全球狀態,在這種情況下 - 很糟糕! – tsuki