diff options
Diffstat (limited to 'gcc-4.8/gcc/testsuite/gcc.dg/torture/pr60183.c')
-rw-r--r-- | gcc-4.8/gcc/testsuite/gcc.dg/torture/pr60183.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/gcc-4.8/gcc/testsuite/gcc.dg/torture/pr60183.c b/gcc-4.8/gcc/testsuite/gcc.dg/torture/pr60183.c new file mode 100644 index 000000000..d37b4b80a --- /dev/null +++ b/gcc-4.8/gcc/testsuite/gcc.dg/torture/pr60183.c @@ -0,0 +1,38 @@ +/* { dg-do run } */ + +/* Large so an out-of-bound read will crash. */ +unsigned char c[0x30001] = { 1 }; +int j = 2; + +static void +foo (unsigned long *x, unsigned char *y) +{ + int i; + unsigned long w = x[0]; + for (i = 0; i < j; i++) + { + w += *y; + y += 0x10000; + w += *y; + y += 0x10000; + } + x[1] = w; +} + +__attribute__ ((noinline, noclone)) void +bar (unsigned long *x) +{ + foo (x, c); +} + +int +main () +{ + unsigned long a[2] = { 0, -1UL }; + asm volatile (""::"r" (c):"memory"); + c[0] = 0; + bar (a); + if (a[1] != 0) + __builtin_abort (); + return 0; +} |