1 | // RUN: %clangxx_asan -std=c++11 -pthread %s -o %t && %run %t 2>&1 |
2 | // Regression test for the versioned pthread_create interceptor on linux/i386. |
3 | // pthread_attr_init is not intercepted and binds to the new abi |
4 | // pthread_create is intercepted; dlsym always returns the oldest version. |
5 | // This results in a crash inside pthread_create in libc. |
6 | |
7 | #include <pthread.h> |
8 | #include <stdlib.h> |
9 | |
10 | void *ThreadFunc(void *) { return nullptr; } |
11 | |
12 | int main() { |
13 | pthread_t t; |
14 | const size_t sz = 1024 * 1024; |
15 | void *p = malloc(size: sz); |
16 | pthread_attr_t attr; |
17 | pthread_attr_init(attr: &attr); |
18 | pthread_attr_setstack(attr: &attr, stackaddr: p, stacksize: sz); |
19 | pthread_create(newthread: &t, attr: &attr, start_routine: ThreadFunc, arg: nullptr); |
20 | pthread_join(th: t, thread_return: nullptr); |
21 | free(ptr: p); |
22 | return 0; |
23 | } |
24 | |