例如,给出以下代码:
int f(int n)
{
if (n < 0)
return 0;
n = n + 100;
if (n < 0)
return 0;
return n;
}
Run Code Online (Sandbox Code Playgroud)
假设您传入的数字非常接近整数溢出(小于100),编译器是否会生成会给您带来负回报的代码?
以下是Simon Tatham的"The Descent to C"中关于这个问题的摘录:
"GNU C编译器(gcc)为这个函数生成代码,它可以返回一个负整数,如果你传入(例如)最大表示能够'int'的值.因为编译器在第一个if语句后知道n是正数,然后它假设不发生整数溢出,并使用该假设得出结论,在加法后n的值必须仍为正,因此它完全删除第二个if语句并返回未选中的加法结果.
它让我想知道C++编译器中是否存在同样的问题,如果我不小心我的整数溢出检查不会被跳过.
c++ compiler-construction gcc integer-overflow undefined-behavior