blob: 5014f6f1f7efc58a5c43dbaa7087aaba595e26ce [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-fsanitize=bounds -fno-sanitize-recover=bounds -Wall" } */
/* Don't fail on valid uses. */
struct S { int a[10]; };
struct T { int l; int a[]; };
struct U { int l; int a[0]; };
struct V { int l; int a[1]; };
__attribute__ ((noinline, noclone))
void
fn_p (int p)
{
}
__attribute__ ((noinline, noclone))
void
fn_a (volatile int a[])
{
/* This is not instrumented. */
a[4] = 5;
}
__attribute__ ((noinline, noclone))
int
foo_i (int i)
{
int a[5] = { };
int k = i ? a[i] : i;
return k;
}
int
main (void)
{
volatile int a[5];
a[4] = 1;
a[2] = a[3];
fn_p (a[4]);
fn_a (a);
int i = 4;
a[i] = 1;
a[2] = a[i];
fn_p (a[i]);
foo_i (i);
const int n = 5;
volatile int b[n];
b[4] = 1;
b[2] = b[3];
fn_p (b[4]);
fn_a (b);
volatile int c[n][n][n];
c[2][2][2] = 2;
i = c[4][4][4];
volatile struct S s;
s.a[9] = 1;
i = s.a[9];
/* Don't instrument flexible array members. */
struct T *t = (struct T *) __builtin_malloc (sizeof (struct T) + 10);
t->a[1] = 1;
/* Don't instrument zero-sized arrays (GNU extension). */
struct U *u = (struct U *) __builtin_malloc (sizeof (struct U) + 10);
u->a[1] = 1;
/* Don't instrument last array in a struct. */
struct V *v = (struct V *) __builtin_malloc (sizeof (struct V) + 10);
v->a[1] = 1;
long int *d[10][5];
d[9][0] = (long int *) 0;
d[8][3] = d[9][0];
return 0;
}