GCC8.2如何启用警告:数组下标超出数组范围[-Warray-bounds]

lei*_*iyc 1 c c++ arrays gcc8

我想在gcc8.2下启用数组边界检查,因此它可以帮助检查在编译期间数组下标是否超出范围,它可能会给出如下警告: array subscript is above array bounds [-Warray-bounds]

我使用coliru进行了演示:

#include <iostream>

struct A
{
    int a;
    char ch[1];
};

int main() 
{
    volatile A test;
    test.a = 1;
    test.ch[0] = 'a';
    test.ch[1] = 'b';
    test.ch[2] = 'c';
    test.ch[3] = 'd';
    test.ch[4] = '\0';
    std::cout << sizeof(test) << std::endl
              << test.ch[1] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译并运行以下命令:

g++ -std=c++11  -O2 -Wall main.cpp  && ./a.out
Run Code Online (Sandbox Code Playgroud)

输出显示如下,没有任何警告或错误。

8
b
Run Code Online (Sandbox Code Playgroud)

那么gcc8.2是否支持数组边界检查?如何启用它?

编辑:

更进一步,基于第一个答案,如果删除volatilein line volatile A test;,是否可以启用数组边界检查?

谢谢。

Mil*_*nek 6

默认情况下,-Warray-bounds不对结构末尾的数组发出警告,以免避免标准化前的灵活数组成员出现假阳性。要启用该检查,请使用-Warray-bounds=2演示

还请注意,-Warray-bounds仅当该-ftree-vrp标志处于活动状态时才起作用,默认情况下,该状态为-O2或更高。