在从GCC 10.2切换到GCC 11时遇到错误警告,我正在寻找解决方法。
char* const dest = data_.data();
if (src.length() > max_chars)
{
// does not fit, copy first max_chars (truncation occurs)
std::memcpy(dest, src.data(), max_chars);
在上述代码中,src
是std::string_view
,dest是静态大小精确为max_chars
的std::array
。memcpy行生成警告(带-O3(:
array subscript ‘unsigned char [81][1]’ is partly outside array bounds of ‘myns::TrivialString<81> [1]’ [-Werror=array-bounds]
尽管代码中没有直接涉及的下标。我知道用are";部分";在较新的GCC版本中是越界的,这个问题与这个bug最相似,尽管我看到有一些bug出现了类似的症状。
我的一个变通方法是更换
std::memcpy(dest, src.data(), max_chars);
带有
std::copy_n(src.data(), max_chars, dest);
该解决方案没有可读性或性能下降。