繁体   English   中英

优化标志会导致计算错误

[英]Optimization flags cause incorrect computation

我有一个奇怪的优化错误,所以我试图确定哪个标志导致它。 使用-O1时会发生错误(计算错误),但不会使用-O0 因此,我认为我可以使用-O1 includes to narrow down the culprit所有-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 ,任何关于如何寻找的想法都会导致它无法工作?

EDIT2

如果我使用正常释放标志进行编译,则会出现计算错误。 但是,如果我添加:

-ffloat-store

要么

-mpc64

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

任何人都可以建议一种方法来追踪这个标志产生差异的线,这样我就可以改变它,而不是要求每个人使用代码来编译一个额外的标志?

从我的GCC / C ++时代开始,我记得的这样的优化错误就是在没有指定返回值的方法上使用-O0将返回该方法中该类型的最后一个值(可能是你想要返回的那个?)而对其进行优化则返回了类型的默认值,而不是方法中类型的最后一个值(这可能只适用于值类型,我不记得了)。 这意味着你会在调试标志开启的情况下开发多年,一切看起来都很好,然后在你优化时就会停止工作。

对我来说,没有指定返回值是一个编译错误,但那时就是C ++。

对此的解决方案是打开最强的警告集,然后将所有警告视为错误:这将突出显示这样的事情。 (如果你还没有这样做,那么你会感到痛苦!)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM