37 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s2#include "test.h"3#include <string.h>4 5int x[4], z[4];6 7void *MemCpyThread(void *a) {8 memcpy((int*)a, z, 16);9 barrier_wait(&barrier);10 return NULL;11}12 13void *MemSetThread(void *a) {14 barrier_wait(&barrier);15 memset((int*)a, 0, 16);16 return NULL;17}18 19int main() {20 barrier_init(&barrier, 2);21 pthread_t t[2];22 // Race on x between memcpy and memset23 pthread_create(&t[0], NULL, MemCpyThread, x);24 pthread_create(&t[1], NULL, MemSetThread, x);25 pthread_join(t[0], NULL);26 pthread_join(t[1], NULL);27 fprintf(stderr, "PASS\n");28 return 0;29}30 31// CHECK: WARNING: ThreadSanitizer: data race32// CHECK: #0 {{.*}}memset33// CHECK: #{{[12]}} MemSetThread34// CHECK: Previous write35// CHECK: #0 {{.*mem(cpy|move)}}36// CHECK: #{{[12]}} MemCpyThread37