【发布时间】:2012-10-01 16:18:55
【问题描述】:
我刚刚发现了一个奇怪的错误,它仅在打开优化时才会出现 (g++ -O2)。当interval 设置为零(来自命令行参数)时,它是以下代码中的Arithmetic exception:
for(int i = 0; i < n; ++i) {
if((i + 1) % interval == 0) { // exception here
DoSomething();
}
}
很明显,模零运算抛出了被零除的异常,但为什么只有在打开优化编译代码时才会出现这种情况?
【问题讨论】:
-
我建议你看一下汇编输出,看看它们是否都执行了除法。还有,什么编译器? g++?
-
奇怪的不是优化版本抛出异常,而是非优化版本没有。相反,它做了什么,调用结果
0?还是!0? -
愿意分享完整的程序、编译器版本和编译器开关吗?我无法复制您在 g++ 4.0.1/OSX 上看到的行为。每次优化和未优化版本都会出现“浮点异常”。
-
@Oren:作为一个最小的例子,我确实尝试将代码简化为 for 循环和 if 语句,但这会改变一些事情。在那一个上,优化和非优化版本的行为是一样的,现在他们抛出一个
Floating point exception。 (完整代码版,优化版为Arithmetic exception)。所以很难复制或分享...... -
对我来说,我只在非优化代码上得到“浮点异常”错误,在优化代码上没有错误。我猜它真的是未定义的。
标签: c++ optimization compiler-construction divide-by-zero