簡體   English   中英

gcc優化導致app失敗

[英]gcc optimizations cause app to fail

我在使用GCC for ARM時出現了一個非常奇怪的問題,並且啟用了優化。 在沒有優化的情況下編譯我的C ++應用程序會生成一個可執行文件,在運行時輸出預期的結果。 一旦我打開優化 - 即-O1 - 我的應用程序就無法產生預期的結果。 我試了幾天才發現問題,但我很無能為力。 我從我的代碼中刪除了任何未初始化的變量,我糾正了嚴格混疊可能導致問題但仍然沒有正確結果的位置。

我正在使用GCC 4.2.0 for ARM(處理器是ARM​​926ej-s)並在Montavista Linux發行版上運行該應用程序。

以下是我正在使用的標志:

-O1 -fno-unroll-loops fno-merge-constants -fno-omit-frame-pointer -fno-toplevel-reorder \
-fno-defer-pop -fno-function-cse -Wuninitialized -Wstrict-aliasing=3 -Wstrict-overflow=3 \
-fsigned-char -march=armv5te -mtune=arm926ej-s -ffast-math

一旦我剝離-O1標志並重新編譯/重新鏈接應用程序,我就會得到正確的輸出結果。 正如你從旗幟中看到我試圖禁用任何優化我認為它可能會導致問題,但仍然沒有運氣。

有沒有人對如何進一步解決這個問題有任何指示?

謝謝

一般來說,如果你說“優化打破了我的程序”,你的程序就會被破壞99.9%。 啟用優化僅揭示代碼中的錯誤。

您還應該輕松完成優化選項。 只有在非常特殊的情況下,您才需要除標准選項-O0,-O2,-O3和-Os之外的任何其他選項。 如果您覺得確實需要更多特定設置,請注意優化的口號:

測量,優化,測量。

永遠不要去這里“直覺”。 證明某個非標准優化選項確實有效地使您的應用程序受益, 並理解為什么 (即,准確理解該選項的作用以及它為什么會影響您的代碼)。

這不是蒙住眼睛的好地方。

看看你如何使用防御性最強的選項(-O1),然后禁用六個優化, 然后添加-ffast-math,讓我假設你正在做這個。

好吧,也許是獨眼。

但最重要的是:如果啟用優化會破壞您的代碼,那么很可能是代碼的錯誤。

編輯:我剛剛在GCC手冊中找到了這個:

-ffast-math :任何-O選項都不應該打開此選項,因為它可能導致程序的輸出不正確,這取決於IEEE或ISO規則/規范的數學函數的確切實現。

這確實說,基本上,你的-O1 -ffast-math確實可以破壞正確的代碼。 然而,即使拿走-ffast-math消除你當前的問題,你至少應該知道為什么 否則,你可能只是現在有一個問題,在一個更加不方便時刻交換你的問題 (比如,當你的產品打破你的客戶端的位置)。 這是真的-ffast-math是問題,還是你已經破壞了-ffast-math 發現的數學代碼?

如果可能,應該避免使用-ffast-math 現在只需使用-O1並刪除所有其他優化開關。 如果您仍然遇到問題,那么就該開始調試了。

沒有看到你的代碼,很難比“你可能有一個bug”更具體。

有兩種情況,啟用優化會更改程序的語義:

  • 編譯器中有一個錯誤,或者
  • 您的代碼中存在錯誤。

后者可能是最有可能的。 具體來說,您可能依賴於程序中某處的未定義行為。 當你在台帶有這些編譯器標志的計算機上使用這個編譯器進行編譯時,你依賴的東西恰好是正確的,但語言無法保證。 因此,當您啟用優化時,GCC沒有義務保留該行為。

告訴我們你的代碼。 或者在調試器中逐步執行它,直到出現問題為止。

我不能再具體了。 它可能是一個懸空指針,未初始化的變量,打破別名規則,甚至只是做了許多產生未定義結果的東西之一(比如i = i++

嘗試制作一個最小的測試用例。 重寫程序,刪除不影響錯誤的內容。 您可能會在此過程中自己發現錯誤,但如果不這樣做,您應該有一個可以發布的單屏示例程序。

順便說一句, 如果像其他人紛紛猜測,這是-ffast-math這將導致你的麻煩(即只編譯-O1正常工作),那么很可能你有一些數學在那里,你應該重寫無論如何。 這有點過分簡化,但是-ffast-math允許編譯器基本上重新排列計算,因為你可以抽象數學數字 - 即使在真實硬件上這樣做可能會導致稍微不同的結果,因為浮點數不准確。 依賴於那種浮點細節可能是無意的。

如果你想了解這個bug,那么最小的測試用例在任何情況下都是至關重要的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM