gcc优化导致app失败

cel*_*vek 2 c++ gcc compiler-optimization fast-math

我在使用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
Run Code Online (Sandbox Code Playgroud)

一旦我剥离-O1标志并重新编译/重新链接应用程序,我就会得到正确的输出结果.正如你从旗帜中看到我试图禁用任何优化我认为它可能会导致问题,但仍然没有运气.

有没有人对如何进一步解决这个问题有任何指示?

谢谢

Dev*_*lar 8

一般来说,如果你说"优化打破了我的程序",你的程序就会被破坏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敏感(它可能是你使用的库).敏感代码可能在数值上不稳定,并且至少对您不会立即期望的方式做出变化敏感. (2认同)