blob: e08a3fd80ec2e9baf964a74d545944132e9862b2 [file] [log] [blame]
/* { dg-do run } */
/* { dg-options "-fsanitize=bounds" } */
/* Test negative bounds. */
struct S { int a[10]; };
__attribute__ ((noinline, noclone))
void
fn1 (void)
{
volatile int i;
int m = -1;
volatile int a[7];
asm ("" : : "r" (&a) : "memory");
i = a[-1];
asm ("" : : "r" (&a) : "memory");
i = a[m];
}
__attribute__ ((noinline, noclone))
void
fn2 (void)
{
volatile int i;
int m = 7;
volatile int a[m];
asm ("" : : "r" (&a) : "memory");
i = a[-1];
}
__attribute__ ((noinline, noclone))
void
fn3 (void)
{
volatile int i;
volatile struct S s;
asm ("" : : "r" (&s.a) : "memory");
i = s.a[-1];
}
int
main (void)
{
fn1 ();
fn2 ();
fn3 ();
return 0;
}
/* { dg-output "index -1 out of bounds for type 'int \\\[7\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*index -1 out of bounds for type 'int \\\[7\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*index -1 out of bounds for type 'int \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */
/* { dg-output "\[^\n\r]*index -1 out of bounds for type 'int \\\[10\\\]'" } */