1 // Regression test. Disabler should not depend on TSD validity. 2 // RUN: LSAN_BASE="report_objects=1:use_registers=0:use_stacks=0:use_globals=0:use_tls=1:use_ld_allocations=0" 3 // RUN: %clang_lsan %s -o %t 4 // RUN: LSAN_OPTIONS=$LSAN_BASE %run %t 5 6 #include <assert.h> 7 #include <pthread.h> 8 #include <stdio.h> 9 #include <stdlib.h> 10 11 #include "sanitizer/lsan_interface.h" 12 13 pthread_key_t key; 14 key_destructor(void * arg)15void key_destructor(void *arg) { 16 __lsan_disable(); 17 void *p = malloc(1337); 18 // Break optimization. 19 fprintf(stderr, "Test alloc: %p.\n", p); 20 pthread_setspecific(key, 0); 21 __lsan_enable(); 22 } 23 thread_func(void * arg)24void *thread_func(void *arg) { 25 int res = pthread_setspecific(key, (void*)1); 26 assert(res == 0); 27 return 0; 28 } 29 main()30int main() { 31 int res = pthread_key_create(&key, &key_destructor); 32 assert(res == 0); 33 pthread_t thread_id; 34 res = pthread_create(&thread_id, 0, thread_func, 0); 35 assert(res == 0); 36 res = pthread_join(thread_id, 0); 37 assert(res == 0); 38 return 0; 39 } 40