[Bug c/92290] New: Inconsistent -Warray-bounds warning

sirl at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Wed Oct 30 15:21:00 GMT 2019


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

            Bug ID: 92290
           Summary: Inconsistent -Warray-bounds warning
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c
          Assignee: unassigned at gcc dot gnu.org
          Reporter: sirl at gcc dot gnu.org
  Target Milestone: ---

Created attachment 47133
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=47133&action=edit
testcase

The attached creduced testcases recently started to warn differently in trunk
(9 and earlier don't warn) depending on variable signedness. But I believe the
possible range of the loop counter values should be the same.

int a, b;
unsigned short t1 (void)
{
  int j;
  unsigned short pu = 0;
  unsigned int p[6] = { 0 };
  unsigned int v;
  for (j = 0; j < 1234; j++)
    {
      v = a;
      if (((v >> 16) & 7) > 0)
        {
          int i;
          b = p[0];
          for (i = 0; i < 6 - (int) ((v >> 16) & 0x07); i++)
            p[i] = p[i + ((v >> 16) & 0x07)];
        }
      pu >>= (int) ((v >> 16) & 0x07) * 2;
    }
  return pu;
}


Compiled with -O2 -Warray-bounds, GCC trunk@277601 warns like this:

testcase.c: In function 't1':
testcase.c:17:14: warning: array subscript 6 is above array bounds of 'unsigned
int[6]' [\-Warray-bounds=\]
   17 |      p[i] = p[i + ((v >> 16) & 0x07)];
      |             ~^~~~~~~~~~~~~~~~~~~~~~~~
testcase.c:7:16: note: while referencing ?p?
    7 |   unsigned int p[6] = { 0 };
      |                ^

t2() is a slight modification with re-arranged loop condition and gives the
same warning.
t3() uses an unsigned loop variable and doesn't warn, which seems the correct
behaviour to me.


More information about the Gcc-bugs mailing list