我有这个代码段:
#include <stdio.h>
int main(int argc, const char** argv)
{
int a = argv[0][0];
int b = argv[0][1];
while ((a >= 0) &&
(a < b))
{
printf("a = %d\n", a);
a++;
}
return 0;
}
我正在编译它gcc-4.5 -02 -Wstrict-overflow=5
.
编译器对我大喊大叫warning: assuming signed overflow does not occur when changing X +- C1 cmp C2 to X cmp C1 +- C2
这究竟意味着什么?
如果我是正确的,这个循环永远不会导致溢出,因为要递增 a,它必须小于另一个整数。如果更大,则循环终止。
谁能向我解释这种行为?
编译器正在优化转换a + 1 < b
to a < b - 1
。
然而,如果b
is INT_MIN
那么这将下溢,这是行为的改变。
这就是它的警告。
当然,您可能会说这是不可能的,但是编译器解决问题的资源有限,并且通常不会对数据路径进行深入分析。
添加一个检查b >= 0
可能会解决问题。
Edit: 还有一种可能是它在移动a >= 0
到循环之外,因为(假设没有溢出)它永远不会改变。同样,该假设可能不适用于所有输入(即,如果b
为负数)。您需要检查最终的装配,看看它实际上做了什么。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)