- 内联函数g ++ 4.9.2中的warray-bounds伪造警告

时间:2014-12-05 02:14:14

标签: c++ gcc

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

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

参数maxn在头文件中定义为constexpr。在我的代码中,传递给n的参数f总是小于或等于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++问题吗?你以前遇到过吗?

1 个答案:

答案 0 :(得分:2)

gcc多次(herehere)报告数组边界检查的误报问题,例如此错误报告 Picon [Bug c/59564] New: False positive array -Warray-bounds check with -O2显示了这一点使用-02时代码和gcc 4.8.2以及gcc 4.9.0会产生误报( see it live ):

int arr[1];
int n = 0;

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

因此,这可能是错误的回归或不同形式,您应该提交bug report