在下面的程序中,如果算术表达式出现问题,我们如何使编译器发出警告/错误?
如果一个算术表达式得到的值超过了其类型的最大值,我希望编译器发出警告/错误。
我用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
有各种各样的消毒剂,他们通常会对违规行为做出很好的报告。