优化标志会导致计算错误
Optimization flags cause incorrect computation
我遇到了一个奇怪的仅限优化的错误,所以我正试图确定是哪个标志导致了它。错误(错误计算)发生在-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++。
解决方案是打开最强的警告集,然后将所有警告视为错误:这将突出显示这样的事情。(如果你还没有这样做,那么你将承受巨大的痛苦!)
如果您已经打开了所有的错误/警告,那么唯一的其他选择就是优化具有副作用的方法调用。这将更难追踪。
- 我的字符计数代码计算错误.为什么
- 为什么 2 个双精度值之间的差值计算错误?
- C++ openmp 并行计算计算错误的结果
- Qt qreal计算错误
- C 并行矩阵乘法,计算错误
- Arduino计算错误 - 不应该时给出负值
- 当尺寸变大时,会出现矩阵计算错误
- C++ if 语句数学计算错误
- 浮点数的不准确导致计算错误
- 优化标志会导致计算错误
- Kahan求和算法在GCC编译时存在较大的计算错误
- 为什么在函数中传递参数时会出现算术计算错误
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- OpenGL漫射照明计算错误
- 具有参数计算错误的重载函数
- 我的程序中有计算错误吗
- 在C++中使用ceil函数时出现计算错误
- 模拟读数计算错误
- struct和time_t的计算错误
- Pow()计算错误