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

            Bug ID: 89427
           Summary: missing -Warray-bounds on a MEM_REF of array plus
                    offset
           Product: gcc
           Version: 9.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
  Target Milestone: ---

The out-of-bounds access below is not diagnosed even though it could be.  The
vrp_pro::check_mem_ref function gives up too soon.  It's passed as an argument
MEM_REF (_2, 0) where _2 = &MEM[(void *)&a + 8B] + _1.  It extracts the _2 but
bails when that's not an ADDR_EXPR of either a STRING_CST or VAR_DECL.  It
should also look the argument of the inner MEM_REF and consider its size and
offset if it's a VAR_DECL.

$ cat u.c && gcc -O2 -S -Wall -Wextra -Warray-bounds=2 u.c
char a[8];

void f (int i)
{
  char *p = a + sizeof a;
  if (i < 5)
    i = 5;
  p[i] = 0;   // missing -Warray-bounds
}

Reply via email to