xref: /aosp_15_r20/external/compiler-rt/test/safestack/pthread-cleanup.c (revision 7c3d14c8b49c529e04be81a3ce6f5cc23712e4c6)
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 Robot void *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 Robot int 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