1*bcaeed49SFangrui Song // RUN: %clangxx_tsan -c -O1 -fno-sanitize=thread %s -o %t.o 2*bcaeed49SFangrui Song // RUN: %clangxx_tsan -O1 %s %t.o -o %t && %run %t 2>&1 | FileCheck %s 3*bcaeed49SFangrui Song 4*bcaeed49SFangrui Song #include <stdio.h> 5*bcaeed49SFangrui Song #include <stdlib.h> 6*bcaeed49SFangrui Song 7*bcaeed49SFangrui Song #if !__has_feature(thread_sanitizer) 8*bcaeed49SFangrui Song 9*bcaeed49SFangrui Song // Defined by tsan. 10*bcaeed49SFangrui Song extern "C" void *__interceptor_malloc(unsigned long size); 11*bcaeed49SFangrui Song extern "C" void __interceptor_free(void *p); malloc(unsigned long size)12*bcaeed49SFangrui Songextern "C" void *malloc(unsigned long size) { 13*bcaeed49SFangrui Song static int first = 0; 14*bcaeed49SFangrui Song if (__sync_lock_test_and_set(&first, 1) == 0) 15*bcaeed49SFangrui Song fprintf(stderr, "user malloc\n"); 16*bcaeed49SFangrui Song return __interceptor_malloc(size); 17*bcaeed49SFangrui Song } 18*bcaeed49SFangrui Song free(void * p)19*bcaeed49SFangrui Songextern "C" void free(void *p) { 20*bcaeed49SFangrui Song __interceptor_free(p); 21*bcaeed49SFangrui Song } 22*bcaeed49SFangrui Song 23*bcaeed49SFangrui Song #else 24*bcaeed49SFangrui Song main()25*bcaeed49SFangrui Songint main() { 26*bcaeed49SFangrui Song volatile char *p = (char*)malloc(10); 27*bcaeed49SFangrui Song p[0] = 0; 28*bcaeed49SFangrui Song free((void*)p); 29*bcaeed49SFangrui Song } 30*bcaeed49SFangrui Song 31*bcaeed49SFangrui Song #endif 32*bcaeed49SFangrui Song 33*bcaeed49SFangrui Song // CHECK: user malloc 34*bcaeed49SFangrui Song // CHECK-NOT: ThreadSanitizer 35*bcaeed49SFangrui Song 36