gcc7.2:参数范围超过最大对象大小 9..7 [-Werror=alloc-size-larger-than=]

Yua*_*Wen 3 c calloc gcc7

该程序包含如下代码:

int size;
...
int *pi = (int*)calloc(size, sizeof(int));
...
Run Code Online (Sandbox Code Playgroud)

这是用gcc7.2编译时的错误信息?

错误:参数 1 范围 [18446744071562067968, 18446744073709551615] 超过最大对象大小 9223372036854775807 [-Werror=alloc-size-larger-than=]

当我
int *pi = (int*)calloc(size, sizeof(int)); 改为
int *pi = (int*)calloc((unsigned int)size, sizeof(int));

错误消失了。

但是,在程序中,有很多malloccalloc我原来的版本一样使用。

为什么gcc只检测到一个错误?

小智 5

我最近在我的 GCC 9.1 版本上遇到了同样的问题,我在 GCC Bugzilla 上发现了这个讨论:

https://gcc.gnu.org/bugzilla//show_bug.cgi?id=85783

正如链接讨论中提到的,我能够通过检查 PTRDIFF_MAX 的大小参数来抑制警告。


小智 1

警告取决于 GCC 认为的范围size。在程序中的那个特定点,它被认为处于该(非常大)范围内。在其他 malloc/calloc 调用站点,它可能没有那么大。

这很大程度上取决于size程序中不同点的计算方式。当然,第一步是确保在使用之前实际对其进行初始化。