我有一个奇怪的优化错误,所以我试图确定导致它的是哪个标志。错误(计算错误)发生在-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
,任何关于该寻找什么的想法会导致它无法工作?
如果我使用正常释放标志进行编译,则会出现计算错误。但是,如果我添加:
-ffloat-store
或
-mpc64
到标志列表,错误就消失了。
任何人都可以建议一种方法来追踪这个标志产生影响的行,这样我就可以改变它而不是要求每个人都使用代码来编译额外的标志吗?
答案 0 :(得分:3)
从我的GCC / C ++时代开始,我记得的优化错误就是在-O0
上没有指定返回值的方法会返回该方法中该类型的最后一个值(可能就是你想要返回吗?)而对它进行优化后返回了类型的默认值,而不是方法中类型的最后一个值(这可能只适用于值类型,我不记得了)。这意味着你会在调试标志开启的情况下开发很长时间并且一切看起来都很好,然后在优化时它会停止工作。
对于我来说,没有指定返回值是一个编译错误,但当时就是C ++。
解决这个问题的方法是打开最强的警告,然后将所有警告视为错误:这将突出显示这样的事情。 (如果你还没有这样做,那么你会感到痛苦!)
如果您已经拥有所有错误/警告,那么唯一的另一个选择是正在优化带副作用的方法调用。这将更难追查。