GCC 11 错误数组下标部分超出数组边界警告

问题描述

在从 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 是一个 std::array,其静态大小正好是 max_chars。 memcpy生成警告(使用 -O3):

array subscript ‘unsigned char [81][1]’ is partly outside array bounds of ‘myns::TrivialString<81> [1]’ [-Werror=array-bounds]

虽然代码中没有直接涉及的下标。 我知道在较新的 GCC 版本中检测访问的新功能“部分”越界,并且该问题与 this bug 最相似,但我发现有一些 bug 具有类似的症状。

解决方法

我的解决方法是更换

std::memcpy(dest,src.data(),max_chars);

std::copy_n(src.data(),max_chars,dest);

解决方法没有可读性或性能下降。