-内联函数 g++4.9.2 中的 Warray 边界虚假警告

-Warray-bounds bogus warning in inline function g++4.9.2

本文关键字:边界 Warray 警告 中的 函数 g++4      更新时间:2023-10-16

我收到了我遇到过的最奇怪的警告。我有一个内联函数,我正在做类似的事情

inline int f(int n)
{
    int myarray[maxn];
    myarray[n-1] = 1;
}

参数 maxn 在头文件中定义为 constexpr 。在我的代码中,传递给f的参数n总是小于或等于maxn。但是,每当我编译时,我都会收到警告

warning: array subscript is above array bounds [-Warray-bounds]

在行myarray[n-1] = 1.

它只发生在使用g++4.9clang++不会发出任何警告,以及以前的g++版本),并且仅当函数标记为inline .如果我在函数中使用测试条件,例如

if(n > maxn) cerr << "ERROR!"<< endl;

甚至一个简单的显示语句

cout << n; 

警告消失(if当然被评估为false,因此不会显示错误消息,因为我绝对确保n <= maxn;)。

有谁知道这是否是一个g++问题?你以前遇到过吗?

看起来数组边界检查的误报问题已经gcc报告了好几次(这里和这里),例如这个错误报告 Picon[错误 c/59564]新增:误报数组 -Warray-bounds check with -O2 在使用 -02gcc 4.8.2 时显示此代码,gcc 4.9.0产生误报(实时查看):

int arr[1];
int n = 0;
int main() {
  if (n <= 0) n = 0;
  arr[n] = 0;
  if (n <= 0) n = 0;
  return 0;
}

所以这可能是回归或错误的不同形式,您应该提交错误报告。