1

我有一个奇怪的优化错误,所以我试图确定是哪个标志导致它。错误(不正确的计算)发生在-O1,但不是-O0。因此,我认为我可以使用所有-f flags这些-O1 includes to narrow down the culprit. 但是,当我尝试这样做(使用此列表http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)时,它又可以正常工作了!

任何人都可以解释这一点,或提供其他关于寻找什么的建议吗?我已经通过运行代码valgrind,它没有报告任何错误。

编辑

我发现计算是正确的-O0,不正确的-O1,但又是正确的-O1 -ffloat-store。任何关于寻找什么的想法都会导致它没有工作-ffloat-store

编辑2

如果我使用正常的发布标志进行编译,则会出现计算错误。但是,如果我添加任何一个:

-ffloat-store

或者

-mpc64

到标志列表中,错误就消失了。

任何人都可以提出一种方法来追踪该标志产生影响的行,以便我可以更改它而不是要求每个使用代码的人都使用附加标志进行编译?

4

1 回答 1

3

从我的 GCC/C++ 时代开始,我记得的像这样的优化错误是,使用-O0未指定返回值的方法将返回该方法中该类型的最后一个值(可能是您想要返回的值对吗?)而使用对它的优化返回类型的默认值,而不是方法中类型的最后一个值(这可能只适用于值类型,我不记得了)。这意味着您将在调试标志打开的情况下开发很长时间,并且一切看起来都很好,然后在您优化时它将停止工作。

对我来说,不指定返回值是一个编译错误,但那是当时的 C++。

对此的解决方案是打开最强的警告集,然后将所有警告视为错误:这将突出显示此类内容。(如果您还没有这样做,那么您将承受巨大的痛苦!)

如果您已经有所有错误/警告,那么唯一的另一个选择是优化带有副作用的方法调用。这将更难追踪。

于 2012-12-08T16:35:46.097 回答