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