【问题标题】:What is gcc -Wstringop-overflow complaining about here?gcc -Wstringop-overflow 在这里抱怨什么?
【发布时间】:2020-03-27 11:52:50
【问题描述】:

以下代码(从更大、更合理的示例中缩减):

#include <vector>

void shrink(std::vector<int>& v) {
    while (v.size() > 0) {
        v.resize(v.size() - 1);
    }
}

导致 gcc 7.3 发出此警告 (godbolt):

In function 'void shrink(std::vector<int>&)':
cc1plus: warning: 'void* __builtin_memset(void*, int, long unsigned int)':
specified size 18446744073709551612 exceeds maximum object size 9223372036854775807 [-Wstringop-overflow=]

我和一位同事盯着这段代码看了近一个小时,我觉得它是正确的; gcc 在抱怨什么?

【问题讨论】:

  • 代码显然是正确的,所以这是一个虚假警告
  • 这让我有些困惑,为什么代码中有任何memset 调用; -O3 还不够聪明,无法意识到向量永远不会增长吗?我猜该警告与在向量为空时考虑 v.size() - 1 的代码路径有关
  • 似乎在 GCC 8 中已修复。
  • 看起来它已在 GCC 8 中修复:wandbox.org/permlink/qHNcq1h375mdNXNY(用于比较的 GCC 7.3:wandbox.org/permlink/ZIdxVY5FG1eCjxDf

标签: c++ gcc-warning


【解决方案1】:

对我来说似乎是正确的

这个例子是正确的。

gcc 在抱怨什么?

这是一个编译器错误。这是bugzilla。该错误似乎已在 GCC 8 中修复。

【讨论】:

  • 啊,很好的发现!我尝试通过 bugzilla 进行探索,但只发现了不相关的错误。
猜你喜欢
  • 2011-01-14
  • 2016-02-27
  • 2016-04-22
  • 1970-01-01
  • 2017-01-17
  • 2021-11-24
  • 1970-01-01
  • 2022-10-25
  • 2012-01-29
相关资源
最近更新 更多