1 // RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5 #include "test.h" 6 7 void *Thread1(void *p) { 8 *(int*)p = 42; 9 return 0; 10 } 11 12 void *Thread2(void *p) { 13 *(int*)p = 44; 14 return 0; 15 } 16 17 void *alloc() { 18 return malloc(99); 19 } 20 21 void *AllocThread(void* arg) { 22 return alloc(); 23 } 24 25 int main() { 26 void *p = 0; 27 pthread_t t[2]; 28 pthread_create(&t[0], 0, AllocThread, 0); 29 pthread_join(t[0], &p); 30 print_address("addr=", 1, p); 31 pthread_create(&t[0], 0, Thread1, (char*)p + 16); 32 pthread_create(&t[1], 0, Thread2, (char*)p + 16); 33 pthread_join(t[0], 0); 34 pthread_join(t[1], 0); 35 return 0; 36 } 37 38 // CHECK: addr=[[ADDR:0x[0-9,a-f]+]] 39 // CHECK: WARNING: ThreadSanitizer: data race 40 // ... 41 // CHECK: Location is heap block of size 99 at [[ADDR]] allocated by thread T1: 42 // CHCEK: #0 malloc 43 // CHECK: #{{1|2}} alloc 44 // CHECK: #{{2|3}} AllocThread 45 // ... 46 // CHECK: Thread T1 (tid={{.*}}, finished) created by main thread at: 47 // CHECK: #0 pthread_create 48 // CHECK: #1 main 49