GCC 11 触发虚假array subscript partly outside array bounds警告求规避方案
GCC 11 虚假 -Warray-bounds 警告规避方案
该警告为GCC 11新增的部分越界检测逻辑的已知误报,和GCC Bugzilla 98503同源,可根据场景选择以下任意一种方案解决:
- 局部禁用指定警告
对触发警告的代码块包裹GCC诊断编译指令,仅关闭当前代码块的该类警告,不影响全局检测能力:#pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Warray-bounds" std::memcpy(dest, src.data(), max_chars); #pragma GCC diagnostic pop - 替换
std::memcpy为STL拷贝算法
改用std::copy_n实现相同逻辑,GCC对STL算法的边界检测逻辑不会触发该误报,O3优化级别下生成的汇编和std::memcpy完全一致,无性能损失:// 需确保已引入<algorithm>头文件 std::copy_n(src.data(), max_chars, dest); - 强制转换目标指针为
void*
向std::memcpy传入void*类型的目标指针,打断GCC的静态数组边界追踪链路,规避误报:std::memcpy(static_cast<void*>(dest), src.data(), max_chars); - 全局关闭该警告(不推荐)
若项目中大量触发同类误报且已确认无真实越界风险,可在编译参数中添加-Wno-array-bounds关闭全局检测,该方案会同时屏蔽真实的数组越界警告,仅建议临时使用。
内容的提问来源于stack exchange,提问作者haelix
相关产品推荐
相关产品推荐

