1b64d0b1eSPeter Collingbourne // RUN: %clang_safestack %s -o %t 2b64d0b1eSPeter Collingbourne // RUN: %run %t 3b64d0b1eSPeter Collingbourne 4b64d0b1eSPeter Collingbourne // RUN: %clang_nosafestack -fno-stack-protector %s -o %t 5b64d0b1eSPeter Collingbourne // RUN: not %run %t 6b64d0b1eSPeter Collingbourne 7b64d0b1eSPeter Collingbourne // Test that buffer overflows on the unsafe stack do not affect variables on the 8b64d0b1eSPeter Collingbourne // safe stack. 9b64d0b1eSPeter Collingbourne 10c974545cSAdhemerval Zanella // REQUIRES: stable-runtime 11c974545cSAdhemerval Zanella 12*7d644e12SAaron Ballman extern void *memset(void *, int, __typeof__(sizeof(0))); 13*7d644e12SAaron Ballman 14b64d0b1eSPeter Collingbourne __attribute__((noinline)) fct(volatile int * buffer)15b64d0b1eSPeter Collingbournevoid fct(volatile int *buffer) 16b64d0b1eSPeter Collingbourne { 17b64d0b1eSPeter Collingbourne memset(buffer - 1, 0, 7 * sizeof(int)); 18b64d0b1eSPeter Collingbourne } 19b64d0b1eSPeter Collingbourne main(int argc,char ** argv)20b64d0b1eSPeter Collingbourneint main(int argc, char **argv) 21b64d0b1eSPeter Collingbourne { 226e852635SDimitry Andric int prebuf[7]; 23b64d0b1eSPeter Collingbourne int value1 = 42; 24b64d0b1eSPeter Collingbourne int buffer[5]; 25b64d0b1eSPeter Collingbourne int value2 = 42; 266e852635SDimitry Andric int postbuf[7]; 276e852635SDimitry Andric fct(prebuf + 1); 286e852635SDimitry Andric fct(postbuf + 1); 29b64d0b1eSPeter Collingbourne fct(buffer); 30b64d0b1eSPeter Collingbourne return value1 != 42 || value2 != 42; 31b64d0b1eSPeter Collingbourne } 32