| // Check that init-order checking is properly disabled if pthread_create is |
| // called. |
| |
| // RUN: %clangxx_asan %s %p/Helpers/init-order-pthread-create-extra.cc -pthread -o %t |
| // RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:strict_init_order=true %run %t |
| |
| #include <stdio.h> |
| #include <pthread.h> |
| #include <unistd.h> |
| |
| void *bar(void *input, bool sleep_before_init) { |
| if (sleep_before_init) |
| usleep(500000); |
| return input; |
| } |
| |
| void *glob = bar((void*)0x1234, false); |
| extern void *glob2; |
| |
| void *poll(void *arg) { |
| void **glob = (void**)arg; |
| while (true) { |
| usleep(100000); |
| printf("glob is now: %p\n", *glob); |
| } |
| } |
| |
| struct GlobalPollerStarter { |
| GlobalPollerStarter() { |
| pthread_t p; |
| pthread_attr_t attr; |
| pthread_attr_init(&attr); |
| pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); |
| pthread_create(&p, 0, poll, &glob); |
| pthread_attr_destroy(&attr); |
| printf("glob poller is started"); |
| } |
| } global_poller; |
| |
| int main() { |
| printf("%p %p\n", glob, glob2); |
| return 0; |
| } |