/* { dg-do run } */ /* { dg-options "-fsanitize=bounds -Wall -Wextra -Wno-unused -Wno-array-bounds -Wno-uninitialized" } */ /* { dg-options "-fsanitize=bounds -Wall -Wextra -Wno-unused -Wno-array-bounds -Wno-uninitialized -Wno-volatile" { target c++ } } */ /* Test runtime errors. */ struct S { int a[10]; }; struct T { int a[5]; int s[2]; }; int foo_5 (void) { return 5; } __attribute__ ((noinline, noclone)) void fn_p (int p) { (void) p; } static void __attribute__ ((noinline, noclone)) fn1 (void) { volatile int a[5]; asm ("" : : "r" (&a) : "memory"); a[2] = a[5]; } static void __attribute__ ((noinline, noclone)) fn2 (void) { volatile int a[5]; volatile int j; int i = 5; int *p = &i; asm ("" : : "r" (&a) : "memory"); j = a[*p]; } static void __attribute__ ((noinline, noclone)) fn3 (void) { volatile int a[5]; fn_p (a[5]); } static void __attribute__ ((noinline, noclone)) fn4 (void) { struct T t; asm ("" : : "r" (&t.a) : "memory"); t.a[foo_5 ()] = 1; } static void __attribute__ ((noinline, noclone)) fn5 (void) { int i = 5; volatile int a[i]; asm ("" : : "r" (&a) : "memory"); a[2] = a[i]; } static void __attribute__ ((noinline, noclone)) fn6 (void) { int i = 5; volatile int a[i]; volatile int j; fn_p (a[i]); asm ("" : : "r" (&a) : "memory"); j = a[foo_5 ()]; } static void __attribute__ ((noinline, noclone)) fn7 (void) { int n = 5; volatile int i; volatile int c[n][n][n]; asm ("" : : "r" (&c[5]) : "memory"); i = c[5][2][2]; asm ("" : : "r" (&c[2]) : "memory"); i = c[2][5][2]; asm ("" : : "r" (&c[2]) : "memory"); i = c[2][2][5]; } static void __attribute__ ((noinline, noclone)) fn8 (void) { volatile int i; volatile struct S s; asm ("" : : "r" (&s.a) : "memory"); i = s.a[10]; } static void __attribute__ ((noinline, noclone)) fn9 (void) { long int *volatile d[10][5]; asm ("" : : "r" (&d[10]) : "memory"); d[8][3] = d[10][0]; } static void __attribute__ ((noinline, noclone)) fn10 (void) { /* Beware of side-effects. */ volatile int x = 10; volatile int e[20]; e[x++] = 3; if (x != 11) __builtin_abort (); e[x--] = 3; if (x != 10) __builtin_abort (); } static void __attribute__ ((noinline, noclone)) fn11 (void) { char ***volatile f[5]; asm ("" : : "r" (&f) : "memory"); f[2] = f[5]; } static void __attribute__ ((noinline, noclone)) fn12 (int i) { volatile int a[5] = { }; int k = i ? a[i] : i; } int main (void) { fn1 (); fn2 (); fn3 (); fn4 (); fn5 (); fn6 (); fn7 (); fn8 (); fn9 (); fn10 (); fn11 (); fn12 (5); return 0; } /* { dg-output "index 5 out of bounds for type 'int \\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]\\\[\\\*\\\]\\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]\\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[\\\*\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 10 out of bounds for type 'int \\\[10\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 10 out of bounds for type 'long int \\\*\\\[10\\\]\\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'char \\\*\\\*\\\*\\\[5\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ /* { dg-output "\[^\n\r]*index 5 out of bounds for type 'int \\\[5\\\]'" } */