llvm-project/compiler-rt/test/tsan/memcpy_race.cpp
Vitaly Buka b4257d3bf5 [tsan] Replace mem intrinsics with calls to interceptors
After https://reviews.llvm.org/rG463aa814182a23 tsan replaces llvm
intrinsics with calls to glibc functions. However this approach is
fragile, as slight changes in pipeline can return llvm intrinsics back.
In particular InstCombine can do that.

Msan/Asan already declare own version of these memory
functions for the similar purpose.

KCSAN, or anything that uses something else than compiler-rt, needs to
implement this callbacks.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D133268
2022-09-06 13:09:31 -07:00

44 lines
1.1 KiB
C++

// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t | FileCheck %s
#include "test.h"
#include <string.h>
char *data = new char[10];
char *data1 = new char[10];
char *data2 = new char[10];
void *Thread1(void *x) {
static volatile int size = 1;
memcpy(data+5, data1, size);
barrier_wait(&barrier);
return NULL;
}
void *Thread2(void *x) {
static volatile int size = 4;
barrier_wait(&barrier);
memcpy(data+3, data2, size);
return NULL;
}
int main() {
barrier_init(&barrier, 2);
print_address("addr1=", 1, &data[3]);
print_address("addr2=", 1, &data[5]);
pthread_t t[2];
pthread_create(&t[0], NULL, Thread1, NULL);
pthread_create(&t[1], NULL, Thread2, NULL);
pthread_join(t[0], NULL);
pthread_join(t[1], NULL);
return 0;
}
// CHECK: addr1=[[ADDR1:0x[0-9,a-f]+]]
// CHECK: addr2=[[ADDR2:0x[0-9,a-f]+]]
// CHECK: WARNING: ThreadSanitizer: data race
// CHECK: Write of size 4 at [[ADDR1]] by thread T2:
// CHECK: #0 {{.*mem(cpy|move)}}
// CHECK: #{{[12]}} Thread2
// CHECK: Previous write of size 1 at [[ADDR2]] by thread T1:
// CHECK: #0 {{.*mem(cpy|move)}}
// CHECK: #{{[12]}} Thread1