Viewing file: Warray-bounds-80.c (2.71 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* PR tree-optimization/101397 - spurious warning writing to the result of stpcpy minus 1 { dg-do compile } { dg-options "-O2 -Wall" } */
char* stpcpy (char*, const char*);
void sink (int, ...);
extern char ax[], a3[3], a5[5], *s;
volatile int x;
void test_stpcpy (int i) { { char *p = stpcpy (ax, s); x = p[-9]; // { dg-bogus "\\\[-Warray-bounds" } x = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } x = p[ 0]; x = p[+9]; }
{ char *p = stpcpy (a3, s); x = p[-2]; // { dg-bogus "\\\[-Warray-bounds" } x = p[-1]; // { dg-bogus "\\\[-Warray-bounds" } }
{ char *p = stpcpy (a3, s); x = p[-3]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-2], p[-1], p[0], p[1], p[2]); x = p[ 3]; // { dg-warning "\\\[-Warray-bounds" } }
{ /* Stpcpy always returns a pointer to the copied nul (which must exist) and never a past-the-end pointer. As a result, P below is in [a5, a5 + 4]. */ char *p = stpcpy (a5, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2], p[3], p[4]); x = p[ 5]; // { dg-warning "\\\[-Warray-bounds" } }
{ char *p = stpcpy (a5 + 1, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2], p[3]); x = p[ 4]; // { dg-warning "\\\[-Warray-bounds" } }
{ char *p = stpcpy (a5 + 2, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1], p[2]); x = p[ 3]; // { dg-warning "\\\[-Warray-bounds" } }
{ char *p = stpcpy (a5 + 3, s); x = p[-5]; // { dg-warning "\\\[-Warray-bounds" } sink (p[-4], p[-3], p[-2], p[-1], p[0]); sink (p[1]); x = p[ 2]; // { dg-warning "\\\[-Warray-bounds" } }
{ /* Because strlen (a3) is at most 2, the stpcpy call must return a pointer in the range [ax, ax + 2], and so -3 is necessarily out of bounds. */ char *p = stpcpy (ax, a3); p[-3] = 1; // { dg-warning "\\\[-Warray-bounds" } }
{ if (i >= 0) i = -1;
char *p = stpcpy (a3, s); x = p[i]; // { dg-bogus "\\\[-Warray-bounds" } }
{ if (i >= -3) i = -3;
char *p = stpcpy (a3, s); p[i] = 1; // { dg-warning "\\\[-Warray-bounds" } }
}
|