问题描述
在从 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);
解决方法没有可读性或性能下降。