【发布时间】: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