1*7c3d14c8STreehugger Robot // RUN: %clang_safestack %s -pthread -o %t 2*7c3d14c8STreehugger Robot // RUN: not --crash %run %t 3*7c3d14c8STreehugger Robot 4*7c3d14c8STreehugger Robot // Test that unsafe stacks are deallocated correctly on thread exit. 5*7c3d14c8STreehugger Robot 6*7c3d14c8STreehugger Robot #include <stdlib.h> 7*7c3d14c8STreehugger Robot #include <string.h> 8*7c3d14c8STreehugger Robot #include <pthread.h> 9*7c3d14c8STreehugger Robot 10*7c3d14c8STreehugger Robot enum { kBufferSize = (1 << 15) }; 11*7c3d14c8STreehugger Robot t1_start(void * ptr)12*7c3d14c8STreehugger Robotvoid *t1_start(void *ptr) 13*7c3d14c8STreehugger Robot { 14*7c3d14c8STreehugger Robot char buffer[kBufferSize]; 15*7c3d14c8STreehugger Robot return buffer; 16*7c3d14c8STreehugger Robot } 17*7c3d14c8STreehugger Robot main(int argc,char ** argv)18*7c3d14c8STreehugger Robotint main(int argc, char **argv) 19*7c3d14c8STreehugger Robot { 20*7c3d14c8STreehugger Robot pthread_t t1; 21*7c3d14c8STreehugger Robot char *buffer = NULL; 22*7c3d14c8STreehugger Robot 23*7c3d14c8STreehugger Robot if (pthread_create(&t1, NULL, t1_start, NULL)) 24*7c3d14c8STreehugger Robot abort(); 25*7c3d14c8STreehugger Robot if (pthread_join(t1, &buffer)) 26*7c3d14c8STreehugger Robot abort(); 27*7c3d14c8STreehugger Robot 28*7c3d14c8STreehugger Robot // should segfault here 29*7c3d14c8STreehugger Robot memset(buffer, 0, kBufferSize); 30*7c3d14c8STreehugger Robot return 0; 31*7c3d14c8STreehugger Robot } 32