为什么这个被零除错误只出现在优化代码中?

Fra*_*ank 3 c++ compiler-construction optimization divide-by-zero

我刚刚发现了一个奇怪的错误,只有在启用优化时才会发生错误(g++ -O2).它是Arithmetic exception在以下代码中,当interval设置为零时(从命令行参数):

for(int i = 0; i < n; ++i) {
  if((i + 1) % interval == 0) { // exception here
    DoSomething();
  }
}
Run Code Online (Sandbox Code Playgroud)

很明显,模零操作会抛出一个被零除的异常,但为什么只有在代码编译时才会启用优化?

Sin*_*ion 13

除以零始终是未定义的行为.使用不同的优化设置获得不同结果的事实仍然适合未定义行为的定义.