| /* PR sanitizer/71498 */ |
| /* { dg-do run } */ |
| /* { dg-options "-fsanitize=bounds -Wno-array-bounds" } */ |
| /* { dg-options "-fsanitize=bounds -Wno-array-bounds -Wno-volatile" { target c++ } } */ |
| |
| struct S { int a[100]; int b, c; } s; |
| |
| __attribute__((noinline, noclone)) int |
| foo (int x) |
| { |
| return s.a[x]; |
| } |
| |
| __attribute__((noinline, noclone)) int |
| bar (int x) |
| { |
| static int *d = &s.a[99]; |
| asm volatile ("" : : "r" (&d)); |
| return s.a[x]; |
| } |
| |
| int |
| main () |
| { |
| volatile int a = 0; |
| a += foo (100); |
| a += bar (100); |
| return 0; |
| } |
| |
| /* { dg-output "index 100 out of bounds for type 'int \\\[100\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ |
| /* { dg-output "\[^\n\r]*index 100 out of bounds for type 'int \\\[100\\\]'\[^\n\r]*(\n|\r\n|\r)" } */ |