1 // RUN: %clang_safestack %s -pthread -o %t 2 // RUN: %run %t 3 4 // Test that pthreads receive their own unsafe stack. 5 6 #include <stdlib.h> 7 #include <string.h> 8 #include <pthread.h> 9 #include "utils.h" 10 11 static int ptr_test = 42; 12 t1_start(void * ptr)13void *t1_start(void *ptr) 14 { 15 if (ptr != &ptr_test) 16 abort(); 17 18 // safe stack 19 int val = ptr_test * 5; 20 21 // unsafe stack 22 char buffer[8096]; // two pages 23 memset(buffer, val, sizeof (buffer)); 24 break_optimization(buffer); 25 26 return ptr; 27 } 28 main(int argc,char ** argv)29int main(int argc, char **argv) 30 { 31 pthread_t t1; 32 void *ptr = NULL; 33 if (pthread_create(&t1, NULL, t1_start, &ptr_test)) 34 abort(); 35 if (pthread_join(t1, &ptr)) 36 abort(); 37 if (ptr != &ptr_test) 38 abort(); 39 return 0; 40 } 41