/* { dg-do run } */ /* { dg-require-effective-target hwaddress_exec } */ /* { dg-shouldfail "hwasan" } */ #include /* Testing that a function with outgoing arguments correctly decrements the stack pointer when a vararray goes out of scope. */ const char * other (int argc, int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k, int l) { const char ** other; { const char * test_array[argc]; test_array[0] = "test string"; test_array[argc - 1] = "hello"; /* To prevent optimisation. */ printf("While the value stored in our test_array is: %s\n", test_array[argc - 1]); other = test_array; } /* With the below function call (the one with many arguments), some of the arguments have to be put on the stack, which means we have to reserve some space on the stack for these arguments and that the VLA is stored at a position that is not the stack pointer. */ printf("Hello there!\nOur numbers today are: %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\n", a, b, c, d, e, f, g, h, i, j, k, l); /* This should fail due to a bad read access. */ return other[0]; } int main () { int a, b, c, d, e, f, g, h, i, j, k, l; const char * retval = other (1, a, b, c, d, e, f, g, h, i, j, k, l); /* Numbers don't matter here, just want to ensure the program is reading them so we know they won't be optimised out. */ if (retval) return 1; return 10; }