116 lines · cpp
1// RUN: %clangxx_tsan -O1 %s -o %t2// RUN: %deflake %run %t 2>&1 | FileCheck %s3 4#include <pthread.h>5#include <stdint.h>6#include <stdio.h>7#include <stdlib.h>8#include <string.h>9 10#include "test.h"11 12extern "C" {13void __tsan_on_report(void *report);14void *__tsan_get_current_report();15int __tsan_get_report_data(void *report, const char **description, int *count,16 int *stack_count, int *mop_count, int *loc_count,17 int *mutex_count, int *thread_count,18 int *unique_tid_count, void **sleep_trace,19 unsigned long trace_size);20int __tsan_get_report_mop(void *report, unsigned long idx, int *tid,21 void **addr, int *size, int *write, int *atomic,22 void **trace, unsigned long trace_size);23int __tsan_get_report_thread(void *report, unsigned long idx, int *tid,24 uint64_t *os_id, int *running,25 const char **name, int *parent_tid, void **trace,26 unsigned long trace_size);27}28 29long my_global;30 31void *Thread(void *a) {32 barrier_wait(&barrier);33 my_global = 42;34 return NULL;35}36 37int main() {38 barrier_init(&barrier, 2);39 fprintf(stderr, "&my_global = %p\n", &my_global);40 // CHECK: &my_global = [[GLOBAL:0x[0-9a-f]+]]41 pthread_t t;42 pthread_create(&t, 0, Thread, 0);43 my_global = 41;44 barrier_wait(&barrier);45 pthread_join(t, 0);46 fprintf(stderr, "Done.\n");47}48 49// Required for dyld macOS 12.0+50#if (__APPLE__)51__attribute__((weak))52#endif53__attribute__((disable_sanitizer_instrumentation))54extern "C" void55__tsan_on_report(void *report) {56 fprintf(stderr, "__tsan_on_report(%p)\n", report);57 fprintf(stderr, "__tsan_get_current_report() = %p\n",58 __tsan_get_current_report());59 // CHECK: __tsan_on_report([[REPORT:0x[0-9a-f]+]])60 // CHECK: __tsan_get_current_report() = [[REPORT]]61 62 const char *description;63 int count;64 int stack_count, mop_count, loc_count, mutex_count, thread_count,65 unique_tid_count;66 void *sleep_trace[16] = {0};67 __tsan_get_report_data(report, &description, &count, &stack_count, &mop_count,68 &loc_count, &mutex_count, &thread_count,69 &unique_tid_count, sleep_trace, 16);70 fprintf(stderr, "report type = '%s', count = %d\n", description, count);71 // CHECK: report type = 'data-race', count = 072 73 fprintf(stderr, "mop_count = %d\n", mop_count);74 // CHECK: mop_count = 275 76 int tid;77 void *addr;78 int size, write, atomic;79 void *trace[16] = {0};80 81 __tsan_get_report_mop(report, 0, &tid, &addr, &size, &write, &atomic, trace,82 16);83 fprintf(stderr, "tid = %d, addr = %p, size = %d, write = %d, atomic = %d\n",84 tid, addr, size, write, atomic);85 // CHECK: tid = 1, addr = [[GLOBAL]], size = 8, write = 1, atomic = 086 fprintf(stderr, "trace[0] = %p, trace[1] = %p\n", trace[0], trace[1]);87 // CHECK: trace[0] = 0x{{[0-9a-f]+}}, trace[1] = {{0x0|\(nil\)|\(null\)}}88 89 __tsan_get_report_mop(report, 1, &tid, &addr, &size, &write, &atomic, trace,90 16);91 fprintf(stderr, "tid = %d, addr = %p, size = %d, write = %d, atomic = %d\n",92 tid, addr, size, write, atomic);93 // CHECK: tid = 0, addr = [[GLOBAL]], size = 8, write = 1, atomic = 094 fprintf(stderr, "trace[0] = %p, trace[1] = %p\n", trace[0], trace[1]);95 // CHECK: trace[0] = 0x{{[0-9a-f]+}}, trace[1] = {{0x0|\(nil\)|\(null\)}}96 97 fprintf(stderr, "thread_count = %d\n", thread_count);98 // CHECK: thread_count = 299 100 uint64_t os_id;101 int running;102 const char *name;103 int parent_tid;104 105 __tsan_get_report_thread(report, 0, &tid, &os_id, &running, &name, &parent_tid, trace, 16);106 fprintf(stderr, "tid = %d\n", tid);107 // CHECK: tid = 1108 109 __tsan_get_report_thread(report, 1, &tid, &os_id, &running, &name, &parent_tid, trace, 16);110 fprintf(stderr, "tid = %d\n", tid);111 // CHECK: tid = 0112}113 114// CHECK: Done.115// CHECK: ThreadSanitizer: reported 1 warnings116