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



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

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

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

我正在等待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("%lldn", y);
return 0;
}

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

例如,删除强制转换并使用-ftrapv编译,程序将终止:

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

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

使用离线分析查找溢出是一个复杂的算法问题。假设无限内存资源,可能图灵完备

但是,可以使用内置的杀毒程序在运行时查找此类溢出。

-fsanitize=undefined选项编译。我已经删除了强制转换,因为INT_MAX不足以溢出long long

#include <stdio.h>
#include <limits.h>
int main()
{
int x = 1;
long long int y = x + INT_MAX;
printf("%lldn", y);
return 0;
}

运行产生如下报告:

prog.c:7:25: runtime error: signed integer overflow: 1 + 2147483647 cannot be represented in type 'int'
-2147483648

有各种各样的消毒剂,他们通常会对违规行为做出很好的报告。

最新更新