首页 >后端开发 >C++ >为什么此 C 代码在启用优化的 GCC 上产生无限循环?

为什么此 C 代码在启用优化的 GCC 上产生无限循环?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-05 04:47:13790浏览

Why Does This C   Code Produce an Infinite Loop on GCC with Optimizations Enabled?

x86 上的整数溢出:揭开无限循环之谜

考虑以下代码片段,当使用 GCC 编译时,它会神秘地陷入无限循环:

int i = 0x10000000;
do {
    i += i;
    cout << i << endl;
} while (i > 0);

秘密解开

虽然整数溢出通常是未定义的行为,但如果发生溢出,x86 架构的整数算术指令通常会回绕。然而,在这种情况下,GCC 的优化引入了异常。

优化的不幸

启用优化后,GCC 假定不可能出现整数溢出,并消除循环退出条件检查。因此,当整数 i 环绕为负值时,循环会无休止地继续。

Visual Studio 的正确处理

Visual Studio,另一方面,正确处理整数溢出并按预期退出循环。

确定未定义行为

这种奇怪的行为凸显了未定义行为的不可预测性。尽管 x86 上需要整数环绕,但未定义的行为可能会以意想不到的方式表现出来,从而使编译器的预测受挫。

解决方法

  • 禁用优化 (-O0)强制执行显式溢出检查。
  • 使用 -fwrapv 标志启用明确定义的溢出语义。但是,请注意潜在的性能损失。

结论

GCC 在存在未定义行为的情况下选择优化循环退出条件会导致令人困惑的结果无限循环。这提醒人们违反未定义的行为规则会产生不可预测的后果,在 x86 平台上使用整数算术时需要小心。

以上是为什么此 C 代码在启用优化的 GCC 上产生无限循环?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn