| // RUN: %clang_safestack %s -pthread -o %t |
| // RUN: %run %t |
| |
| // XFAIL: darwin |
| |
| // Test that pthreads receive their own unsafe stack. |
| |
| #include <stdlib.h> |
| #include <string.h> |
| #include <pthread.h> |
| #include "utils.h" |
| |
| static int ptr_test = 42; |
| |
| void *t1_start(void *ptr) |
| { |
| if (ptr != &ptr_test) |
| abort(); |
| |
| // safe stack |
| int val = ptr_test * 5; |
| |
| // unsafe stack |
| char buffer[8096]; // two pages |
| memset(buffer, val, sizeof (buffer)); |
| break_optimization(buffer); |
| |
| return ptr; |
| } |
| |
| int main(int argc, char **argv) |
| { |
| pthread_t t1; |
| void *ptr = NULL; |
| if (pthread_create(&t1, NULL, t1_start, &ptr_test)) |
| abort(); |
| if (pthread_join(t1, &ptr)) |
| abort(); |
| if (ptr != &ptr_test) |
| abort(); |
| return 0; |
| } |