小编Sai*_*nti的帖子

gcc是否会跳过此检查以查找有符号整数溢出?

例如,给出以下代码:

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

3
推荐指数
1
解决办法
578
查看次数