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