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

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic

--- Comment #3 from Martin Sebor <msebor at gcc dot gnu.org> ---
Confirmed with the following small test case.

$ cat d.c && /ssd/build/gcc-git-i386/gcc/xg++ -B/ssd/build/gcc-git-i386/gcc -O2
-S -Warray-bounds -fdump-tree-wrestrict d.c
char a[4];

void f (void *d, unsigned n)
{
  if (n < 1) n = 1;

  __builtin_memcpy (d, a + sizeof a - n, n);
}
d.c: In function ‘void f(void*, unsigned int)’:
d.c:7:20: warning: ‘void* __builtin_memcpy(void*, const void*, unsigned int)’
offset [5, 3] is out of the bounds [0, 4] of object ‘a’ with type ‘char [4]’
[-Warray-bounds]
   __builtin_memcpy (d, a + sizeof a - n, n);
   ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
d.c:1:6: note: ‘a’ declared here
 char a[4];
      ^

The range for the offset is the anti-range [4, 4] that the logic doesn't handle
correctly.

Reply via email to