用于检查整数溢出的编译器标志 [英] Compiler flags for checking Integer overflow
本文介绍了用于检查整数溢出的编译器标志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
在下面的程序中,如果算术表达式出现问题,我们如何让编译器发出警告/错误。
如果算术表达式产生的值超过其类型的最大值,我希望编译器发出警告/错误。
我用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("%lld
", y);
return 0;
}
推荐答案
如果在GCC中使用-ftrapv
标志,则可以强制程序在整数溢出时中止。
例如,删除强制转换并使用-ftrapv
编译时,程序会中止:
int x = 1;
long long int y = x + INT_MAX;
printf("%lld
", y);
return 0;
> gcc main.c -ftrapv -o overflow
> ./overflow
fish: Job 1, './overflow' terminated by signal SIGABRT (Abort)
我认为主流编译器不支持有符号整数溢出的编译时警告,但您可以在运行时手动检查它们。
这篇关于用于检查整数溢出的编译器标志的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文