| /* { 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\\\]'" } */ |