1 // RUN: %clangxx_asan %s -lpthread -o %t
2 // RUN: ASAN_OPTIONS=detect_stack_use_after_return=1 %t 2>&1 | FileCheck %s --check-prefix=CHECK1
3 // RUN: ASAN_OPTIONS=detect_stack_use_after_return=0 %t 2>&1 | FileCheck %s --check-prefix=CHECK0
8 #include <sanitizer/asan_interface.h>
10 static const int kNumThreads
= 2;
12 void *Thread(void *unused
) {
13 void *fake_stack
= __asan_get_current_fake_stack();
16 fprintf(stderr
, "fake stack found: %p; var: %p\n", fake_stack
, var
);
17 // CHECK1: fake stack found
18 // CHECK1: fake stack found
21 __asan_addr_is_in_fake_stack(fake_stack
, &var
[0], &beg
, &end
);
23 assert((char*)beg
<= (char*)&var
[0]);
24 assert((char*)end
> (char*)&var
[0]);
25 for (int i
= -32; i
< 15; i
++) {
27 char *ptr
= &var
[0] + i
;
29 __asan_addr_is_in_fake_stack(fake_stack
, ptr
, &beg1
, &end1
);
30 assert(real_stack
== real_stack1
);
35 fprintf(stderr
, "no fake stack\n");
36 // CHECK0: no fake stack
37 // CHECK0: no fake stack
42 int main(int argc
, char **argv
) {
43 pthread_t t
[kNumThreads
];
44 for (int i
= 0; i
< kNumThreads
; i
++)
45 pthread_create(&t
[i
], 0, Thread
, 0);
46 for (int i
= 0; i
< kNumThreads
; i
++)
47 pthread_join(t
[i
], 0);