1*673dc3d4SNico Weber // Check that init-order checking is properly disabled if pthread_create is
2*673dc3d4SNico Weber // called.
3*673dc3d4SNico Weber
4*673dc3d4SNico Weber // RUN: %clangxx_asan -c -DCONFIG1 %s -o %t1.o
5*673dc3d4SNico Weber // RUN: %clangxx_asan -c %s -o %t2.o
6*673dc3d4SNico Weber // RUN: %clangxx_asan -pthread %t1.o %t2.o -o %t
7*673dc3d4SNico Weber // RUN: %env_asan_opts=strict_init_order=true %run %t
8*673dc3d4SNico Weber
9*673dc3d4SNico Weber #ifdef CONFIG1
10*673dc3d4SNico Weber
11*673dc3d4SNico Weber #include <stdio.h>
12*673dc3d4SNico Weber #include <pthread.h>
13*673dc3d4SNico Weber #include <unistd.h>
14*673dc3d4SNico Weber
bar(void * input,bool sleep_before_init)15*673dc3d4SNico Weber void *bar(void *input, bool sleep_before_init) {
16*673dc3d4SNico Weber if (sleep_before_init)
17*673dc3d4SNico Weber usleep(500000);
18*673dc3d4SNico Weber return input;
19*673dc3d4SNico Weber }
20*673dc3d4SNico Weber
21*673dc3d4SNico Weber void *glob = bar((void*)0x1234, false);
22*673dc3d4SNico Weber extern void *glob2;
23*673dc3d4SNico Weber
poll(void * arg)24*673dc3d4SNico Weber void *poll(void *arg) {
25*673dc3d4SNico Weber void **glob = (void**)arg;
26*673dc3d4SNico Weber while (true) {
27*673dc3d4SNico Weber usleep(100000);
28*673dc3d4SNico Weber printf("glob is now: %p\n", *glob);
29*673dc3d4SNico Weber }
30*673dc3d4SNico Weber }
31*673dc3d4SNico Weber
32*673dc3d4SNico Weber struct GlobalPollerStarter {
GlobalPollerStarterGlobalPollerStarter33*673dc3d4SNico Weber GlobalPollerStarter() {
34*673dc3d4SNico Weber pthread_t p;
35*673dc3d4SNico Weber pthread_attr_t attr;
36*673dc3d4SNico Weber pthread_attr_init(&attr);
37*673dc3d4SNico Weber pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
38*673dc3d4SNico Weber pthread_create(&p, 0, poll, &glob);
39*673dc3d4SNico Weber pthread_attr_destroy(&attr);
40*673dc3d4SNico Weber printf("glob poller is started");
41*673dc3d4SNico Weber }
42*673dc3d4SNico Weber } global_poller;
43*673dc3d4SNico Weber
main()44*673dc3d4SNico Weber int main() {
45*673dc3d4SNico Weber printf("%p %p\n", glob, glob2);
46*673dc3d4SNico Weber return 0;
47*673dc3d4SNico Weber }
48*673dc3d4SNico Weber
49*673dc3d4SNico Weber #else // CONFIG1
50*673dc3d4SNico Weber
51*673dc3d4SNico Weber void *bar(void *input, bool sleep_before_init);
52*673dc3d4SNico Weber void *glob2 = bar((void*)0x2345, true);
53*673dc3d4SNico Weber
54*673dc3d4SNico Weber #endif
55