【问题标题】:Compiler flags for checking Integer overflow用于检查整数溢出的编译器标志
【发布时间】:2021-11-05 07:40:31
【问题描述】:

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

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

我使用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\n", y);
    return 0;
}

【问题讨论】:

  • long long 可能远大于INT_MAX(4 字节)+ 1 godbolt.org/z/GezYEcejj
  • long long 有点像红鲱鱼,因为算术无论如何都会溢出这些值,但对于 int x = -1 它不会。程序员需要关注整数范围。如果这是在一个函数中,并且 int x 作为参数传递(它的运行时值未知),你会期待一个警告吗?
  • int a, b; /* ... a&gt;0, b&gt;0 ... */ if (a &gt; INT_MAX - b) fprintf(stderr, "a + b overflows\n");
  • @WeatherVane,我同意你的观点,对于这些问题,很难亲自跟踪整个代码(如果它很大)。我只是好奇是否有任何可用的标志,这样会更容易:)
  • 这是一个实践问题。如果算术结果是一个更大的类型,那么你应该知道它会溢出。它类似于int x=3, y=2; float z=x/y 失态。

标签: c compiler-errors compiler-warnings integer-overflow type-promotion


【解决方案1】:

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

例如,移除你的演员表并使用-ftrapv 编译,你的程序会中止:

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

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

【讨论】:

  • 是的,我看到post ,-ftrapv 也被提及。只是想在编译时知道是否可以检测到。
  • @IrAM 不幸的是,我认为编译器不提供此功能。
【解决方案2】:

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

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

只需使用-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("%lld\n", y);
    return 0;
}

运行产生以下报告:

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

有各种各样的消毒剂,通常会产生非常好的违规报告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2018-02-28
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多