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