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