优化标志会导致计算错误

Optimization flags cause incorrect computation

本文关键字:计算 错误 标志 优化      更新时间:2023-10-16

我遇到了一个奇怪的仅限优化的错误,所以我正试图确定是哪个标志导致了它。错误(错误计算)发生在-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

对于标志列表,错误消失。

有人能提出一种方法来追踪这个标志的作用吗?这样我就可以潜在地更改它,而不是要求每个使用代码的人都使用额外的标志进行编译?

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

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

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

如果您已经打开了所有的错误/警告,那么唯一的其他选择就是优化具有副作用的方法调用。这将更难追踪。