1*7c3d14c8STreehugger Robot // RUN: %clang_tsan -O1 %s -o %t 2*7c3d14c8STreehugger Robot // RUN: %deflake %run %t | FileCheck %s --check-prefix=CHECK-NOZUPP 3*7c3d14c8STreehugger Robot // RUN: %env_tsan_opts=suppressions='%s.supp':print_suppressions=1 %run %t 2>&1 | FileCheck %s --check-prefix=CHECK-SUPP 4*7c3d14c8STreehugger Robot 5*7c3d14c8STreehugger Robot #include "test.h" 6*7c3d14c8STreehugger Robot 7*7c3d14c8STreehugger Robot int *mem; 8*7c3d14c8STreehugger Robot pthread_mutex_t mtx; 9*7c3d14c8STreehugger Robot Thread1(void * x)10*7c3d14c8STreehugger Robotvoid *Thread1(void *x) { 11*7c3d14c8STreehugger Robot pthread_mutex_lock(&mtx); 12*7c3d14c8STreehugger Robot free(mem); 13*7c3d14c8STreehugger Robot pthread_mutex_unlock(&mtx); 14*7c3d14c8STreehugger Robot barrier_wait(&barrier); 15*7c3d14c8STreehugger Robot return NULL; 16*7c3d14c8STreehugger Robot } 17*7c3d14c8STreehugger Robot Thread2(void * x)18*7c3d14c8STreehugger Robotvoid *Thread2(void *x) { 19*7c3d14c8STreehugger Robot barrier_wait(&barrier); 20*7c3d14c8STreehugger Robot pthread_mutex_lock(&mtx); 21*7c3d14c8STreehugger Robot mem[0] = 42; 22*7c3d14c8STreehugger Robot pthread_mutex_unlock(&mtx); 23*7c3d14c8STreehugger Robot return NULL; 24*7c3d14c8STreehugger Robot } 25*7c3d14c8STreehugger Robot main()26*7c3d14c8STreehugger Robotint main() { 27*7c3d14c8STreehugger Robot barrier_init(&barrier, 2); 28*7c3d14c8STreehugger Robot mem = (int*)malloc(100); 29*7c3d14c8STreehugger Robot pthread_mutex_init(&mtx, 0); 30*7c3d14c8STreehugger Robot pthread_t t; 31*7c3d14c8STreehugger Robot pthread_create(&t, NULL, Thread1, NULL); 32*7c3d14c8STreehugger Robot Thread2(0); 33*7c3d14c8STreehugger Robot pthread_join(t, NULL); 34*7c3d14c8STreehugger Robot pthread_mutex_destroy(&mtx); 35*7c3d14c8STreehugger Robot return 0; 36*7c3d14c8STreehugger Robot } 37*7c3d14c8STreehugger Robot 38*7c3d14c8STreehugger Robot // CHECK-NOZUPP: WARNING: ThreadSanitizer: heap-use-after-free 39*7c3d14c8STreehugger Robot // CHECK-NOZUPP: Write of size 4 at {{.*}} by main thread{{.*}}: 40*7c3d14c8STreehugger Robot // CHECK-NOZUPP: #0 Thread2 41*7c3d14c8STreehugger Robot // CHECK-NOZUPP: #1 main 42*7c3d14c8STreehugger Robot // CHECK-NOZUPP: Previous write of size 8 at {{.*}} by thread T1{{.*}}: 43*7c3d14c8STreehugger Robot // CHECK-NOZUPP: #0 free 44*7c3d14c8STreehugger Robot // CHECK-NOZUPP: #{{(1|2)}} Thread1 45*7c3d14c8STreehugger Robot // CHECK-NOZUPP: SUMMARY: ThreadSanitizer: heap-use-after-free{{.*}}Thread2 46*7c3d14c8STreehugger Robot // CHECK-SUPP: ThreadSanitizer: Matched 1 suppressions 47*7c3d14c8STreehugger Robot // CHECK-SUPP: 1 race:^Thread2$ 48