迭代3u调用未识别的错误

时间:2014-06-22 10:32:51

标签: gcc compiler-construction gcc-warning

#include <iostream>    
int main()
{
    for (int i = 0; i < 4; ++i)
        std::cout << i*5000000000 << std::endl;
}

每当我尝试运行此命令时都会收到来自gcc的警告。

: -

warning: iteration 3u invokes undefined behavior [-Waggressive-loop-optimizations]
   std::cout << i*5000000000 << std::endl;

这个错误的原因是什么?

1 个答案:

答案 0 :(得分:2)

有符号整数溢出(严格来说,没有&#34;无符号整数溢出&#34;)意味着未定义的行为。 无符号整数,声明无符号,应遵守算术模2n的定律,其中n是整数特定大小的值表示中的位数。我怀疑它是这样的:(1)因为每次迭代都是任何大于2的值的i都有未定义的行为 - &gt; (2)我们可以假设i <= 2用于优化目的 - &gt; (3)循环条件总是正确的 - &gt; (4)它被优化成无限循环。

正在发生的是强度降低的情况,更具体地说,是诱导变量消除的情况。编译器通过发出代码来消除乘法,而代码在每次迭代时将i增加1e9(并相应地改变循环条件)。这是&#34;完全有效的优化,好像&#34;规则,因为这个程序无法观察到它的表现是否良好。唉,它没有,优化&#34;泄漏&#34;