用于检查整数溢出的编译器标志

IrA*_*rAM 4 c compiler-errors integer-overflow compiler-warnings type-promotion

在下面的程序中,如果算术表达式出现问题,我们如何使编译器发出警告/错误。

如果算术表达式产生的值超过其类型的最大值,我希望编译器发出警告/错误。

我已经使用编译了下面的程序gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4),使用的编译命令是gcc int_promo_flags.c -Wall -Wextra

我期待来自 line 的警告/错误long long int y = x + INT_MAX;,但没有报告错误/警告。

通过强制转换x(long long) x我们可以使表达式产生正确的值。但是,如果算术表达式将溢出其参数类型,是否有任何编译器标志会发出警告。

#include <stdio.h>
#include <limits.h>

int main()
{
    int x = 1;
    long long int y = (long long) x + INT_MAX;
    printf("%lld\n", y);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*ein 5

如果您-ftrapv在 gcc 中使用该标志 - 您可以强制程序在整数溢出时中止。

例如,删除强制类型转换并使用 进行编译-ftrapv,程序将中止:

int x = 1;
long long int y = x + INT_MAX;
printf("%lld\n", y);
return 0;
Run Code Online (Sandbox Code Playgroud)
> gcc main.c -ftrapv -o overflow
> ./overflow
fish: Job 1, './overflow' terminated by signal SIGABRT (Abort)
Run Code Online (Sandbox Code Playgroud)

我认为主流编译器不支持有符号整数溢出的编译时警告,但您可以在运行时手动检查它们。