1// RUN: %clangxx_tsan -O1 %s -o %t && %deflake %run %t 2>&1 | FileCheck %s
2#include "../test.h"
3#include <memory.h>
4
5// A reproducer for a known issue.
6// See reference to double_race.cpp in tsan_rtl_report.cpp for an explanation.
7
8long long buf[2];
9volatile int nreport;
10
11__attribute__((disable_sanitizer_instrumentation)) void
12__sanitizer_report_error_summary(const char *summary) {
13 nreport++;
14}
15
16const int kEventPCBits = 61;
17
18extern "C" __attribute__((disable_sanitizer_instrumentation)) bool
19__tsan_symbolize_external(unsigned long pc, char *func_buf,
20 unsigned long func_siz, char *file_buf,
21 unsigned long file_siz, int *line, int *col) {
22 if (pc >> kEventPCBits) {
23 printf(format: "bad PC passed to __tsan_symbolize_external: %lx\n", pc);
24 _exit(status: 1);
25 }
26 return true;
27}
28
29void *Thread(void *arg) {
30 barrier_wait(barrier: &barrier);
31 memset(s: buf, c: 2, n: sizeof(buf));
32 return 0;
33}
34
35int main() {
36 barrier_init(barrier: &barrier, count: 2);
37 pthread_t t;
38 pthread_create(newthread: &t, attr: 0, start_routine: Thread, arg: 0);
39 memset(s: buf, c: 1, n: sizeof(buf));
40 barrier_wait(barrier: &barrier);
41 pthread_join(th: t, thread_return: 0);
42 return 0;
43}
44
45// CHECK: WARNING: ThreadSanitizer: data race
46// CHECK: Write of size 8 at {{.*}} by thread T1:
47// CHECK: #0 {{.*}}memset
48// CHECK: #{{[12]}} Thread
49// CHECK-NOT: bad PC passed to __tsan_symbolize_external
50// CHECK-NOT: __sanitizer_report_error_summary
51// CHECK-NOT: WARNING: ThreadSanitizer: data race
52

source code of compiler-rt/test/tsan/Linux/double_race.cpp