https://gcc.gnu.org/bugzilla/show_bug.cgi?id=107787

            Bug ID: 107787
           Summary: -Werror=array-bounds=X does not work as expected
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: other
          Assignee: unassigned at gcc dot gnu.org
          Reporter: newtonist at yandex dot ru
  Target Milestone: ---

Created attachment 53934
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=53934&action=edit
Suggested fix patch

According to documentation the -Werror= option makes the specified warning into
an error and also automatically implies this option. Then it seems that the
behavior of the compiler when specifying -Werror=array-bounds=X should be the
same as specifying "-Werror=array-bounds -Warray-bounds=X", so we expect to
receive array-bounds pass triggers and they must be processed as errors. In
practice, we observe that the array-bounds pass is indeed called, but its
responses are processed as warnings, not errors.


$ cat testcase.c && gcc -O2 -Werror=array-bounds=1 -c testcase.c
int a[10];

int* f(void) {

    a[-1] = 0;

    return a;
}

testcase.c: In function ‘f’:
testcase.c:5:6: warning: array subscript -1 is below array bounds of ‘int[10]’
[-Warray-bounds]
    5 |     a[-1] = 0;
      |     ~^~~~
testcase.c:1:5: note: while referencing ‘a’
    1 | int a[10];
      |     ^

As I understand, this happens because Warray-bounds and Warray-bounds= are
declared as 2 different options in common.opt, so when
diagnostic_classify_diagnostic() (opts-common.cc:1880) is called, DK_ERROR is
set for the Warray-bounds= option, but in diagnostic_report_diagnostic()
(diagnostic.cc:1446) through warning_at() passes opt_index of Warray-bounds, so
information about DK_ERROR is lost. My suggestion is to use Alias in
declaration of Warray-bounds (similarly as in Wattribute-alias etc.)
I plan to send this patch to the mailing list.

Reply via email to