C++ gcc-Wstringop溢出在这里抱怨什么?

C++ gcc-Wstringop溢出在这里抱怨什么?,c++,gcc-warning,C++,Gcc Warning,以下代码(从更大、更合理的示例中缩减): #包括 空洞收缩(标准::矢量和v){ 而(v.size()>0){ v、 调整大小(v.size()-1); } } 导致gcc 7.3发出此警告(): 函数“void shrink(std::vector&)”中的 cc1plus:警告:“void*\uuu内置\u memset(void*,int,long unsigned int)”: 指定的大小18446744073709551612超过最大对象大小9223372036854775807[-

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

#包括
空洞收缩(标准::矢量和v){
而(v.size()>0){
v、 调整大小(v.size()-1);
}
}
导致gcc 7.3发出此警告():

函数“void shrink(std::vector&)”中的

cc1plus:警告:“void*\uuu内置\u memset(void*,int,long unsigned int)”:
指定的大小18446744073709551612超过最大对象大小9223372036854775807[-Wstringop溢出=]
我和一位同事一起盯着这个代码看了将近一个小时,我觉得它是正确的;gcc在抱怨什么

对我来说这似乎是正确的

这个例子是正确的

gcc在抱怨什么


这是一个编译器错误。这是你的电话号码。GCC 8中的错误似乎已修复。

代码显然是正确的,因此这是一个虚假警告。我有点困惑,为什么代码中有任何
memset
调用;
-O3
是否仍然不够聪明,无法意识到向量永远不会增长?我猜这个警告与一个代码路径有关,当向量清空时,考虑了
v.size()!我试着在bugzilla中探索,但只发现了不相关的虫子。
#include <vector>

void shrink(std::vector<int>& v) {
    while (v.size() > 0) {
        v.resize(v.size() - 1);
    }
}
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=]