用于检查整数溢出的编译器标志 [英] Compiler flags for checking Integer overflow

查看:0
本文介绍了用于检查整数溢出的编译器标志的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

我用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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆