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: ASAN_OPTIONS=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 11static pthread_key_t tsd_key; 12 13void *Thread(void *) { 14 pthread_setspecific(tsd_key, malloc(10)); 15 return 0; 16} 17 18static volatile void *v; 19 20void Dtor(void *tsd) { 21 v = malloc(10000); 22 free(tsd); 23 free((void*)v); // The bug was that this was leaking. 24} 25 26int 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