1// Regression test for http://llvm.org/bugs/show_bug.cgi?id=21621 2// This test relies on timing between threads, so any failures will be flaky. 3// RUN: %clangxx_lsan %s -o %t 4// RUN: LSAN_OPTIONS="log_pointers=1:log_threads=1" %run %t 5#include <assert.h> 6#include <pthread.h> 7#include <stdio.h> 8#include <stdlib.h> 9 10pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 11pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; 12bool flag = false; 13 14void *func(void *arg) { 15 // This mutex will never be grabbed. 16 fprintf(stderr, "entered func()\n"); 17 pthread_mutex_lock(&mutex); 18 free(arg); 19 pthread_mutex_unlock(&mutex); 20 return 0; 21} 22 23void create_detached_thread() { 24 pthread_t thread_id; 25 pthread_attr_t attr; 26 27 pthread_attr_init(&attr); 28 pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 29 30 void *arg = malloc(1337); 31 assert(arg); 32 // This mutex is never unlocked by the main thread. 33 pthread_mutex_lock(&mutex); 34 int res = pthread_create(&thread_id, &attr, func, arg); 35 assert(res == 0); 36} 37 38int main() { 39 create_detached_thread(); 40} 41