【发布时间】: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>0, b>0 ... */ if (a > 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