1 // Regression test for a leak in tsd: 2 // https://code.google.com/p/address-sanitizer/issues/detail?id=233 3 // RUN: %clangxx_asan -O1 %s -pthread -o %t 4 // RUN: %env_asan_opts=quarantine_size_mb=0 %run %t 5 #include <pthread.h> 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <assert.h> 9 #include <sanitizer/allocator_interface.h> 10 11 static pthread_key_t tsd_key; 12 13 void *Thread(void *) { 14 pthread_setspecific(tsd_key, malloc(10)); 15 return 0; 16 } 17 18 static volatile void *v; 19 20 void Dtor(void *tsd) { 21 v = malloc(10000); 22 free(tsd); 23 free((void*)v); // The bug was that this was leaking. 24 } 25 26 int main() { 27 assert(0 == pthread_key_create(&tsd_key, Dtor)); 28 pthread_t t; 29 for (int i = 0; i < 3; i++) { 30 pthread_create(&t, 0, Thread, 0); 31 pthread_join(t, 0); 32 } 33 size_t old_heap_size = __sanitizer_get_heap_size(); 34 for (int i = 0; i < 10; i++) { 35 pthread_create(&t, 0, Thread, 0); 36 pthread_join(t, 0); 37 size_t new_heap_size = __sanitizer_get_heap_size(); 38 fprintf(stderr, "heap size: new: %zd old: %zd\n", new_heap_size, old_heap_size); 39 assert(old_heap_size == new_heap_size); 40 } 41 } 42