【问题标题】:gcc7.2: argument range exceeds maximum object size 9..7 [-Werror=alloc-size-larger-than=]gcc7.2:参数范围超过最大对象大小 9..7 [-Werror=alloc-size-larger-than=]
【发布时间】:2017-11-23 08:25:55
【问题描述】:

程序包含如下代码:

int size;
...
int *pi = (int*)calloc(size, sizeof(int));
...

下面是用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 只检测到一个错误?

【问题讨论】:

标签: c calloc gcc7


【解决方案1】:

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

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

如链接讨论中所述,我可以通过对照 PTRDIFF_MAX 检查 size 参数来抑制警告。

【讨论】:

  • 这个答案有什么问题?它通过显示错误报告的链接来回答问题并提供解决方法。我认为它不值得删除。
【解决方案2】:

警告提到最大对象大小为 9223372036854775807 (0x7FFFFFFFFFFFFFFF)。它是一个实现定义的值。 size_t 必须足够大以容纳该值,并且实际上,由于无符号,它可以取该数字的两倍。 calloc() 函数将两个 size_t 值相乘,其参数为 nmembsize。结果值显然可以超过最大对象大小。

编写好的程序被编码为永远不允许参数中的值超过。但是,如果 gcc 无法找到此类检查,则会发出警告。转换为 4 字节整数会截断超出的值并使编译器满意。

【讨论】:

    【解决方案3】:

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

    这在很大程度上取决于如何在程序的不同点计算size。当然,在任何使用之前确保它实际初始化是第一步。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-20
      • 2018-01-11
      • 1970-01-01
      • 2021-12-14
      • 2015-09-27
      • 1970-01-01
      • 1970-01-01
      • 2021-07-17
      相关资源
      最近更新 更多