1

I want to enable array boundary checking under gcc8.2, so it can help to check if array subscript is out of bound during compilation period, it may give the warning like: array subscript is above array bounds [-Warray-bounds]

I made a demo using 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;
}

Compile and run with command:

g++ -std=c++11  -O2 -Wall main.cpp  && ./a.out

Output is shown below, without any warning or error.

8
b

So does gcc8.2 support array boundary checking? how to enable it?

Edit:

To be further, based on the first answer, if remove the volatile in line volatile A test;, is it possible to enable array boundary checking?

Thanks.

leiyc
  • 903
  • 11
  • 23
  • 1
    For runtime checks you can use [std::array](https://en.cppreference.com/w/cpp/container/array) and compile using the debug version of the STL https://stackoverflow.com/questions/5594686/gcc-stl-bound-checking – Galik Aug 01 '19 at 03:05

1 Answers1

6

By default, -Warray-bounds doesn't warn for arrays at the end of a structures, presumably to avoid false-positives on pre-standardization flexible array members. To enable that checking, use -Warray-bounds=2. Demo.

Note also that -Warray-bounds only works when the -ftree-vrp flag is active, which it is by default at -O2 and higher.

Miles Budnek
  • 28,216
  • 2
  • 35
  • 52