TSan recently got the "ignore_noninstrumented_modules" flag, which disables tracking of read and writes that come from noninstrumented modules (via interceptors). This is a way of suppressing false positives coming from system libraries and other noninstrumented code. This patch turns this on by default on Darwin, where it's supposed to replace the previous solution, "ignore_interceptors_accesses", which disables tracking in *all* interceptors. The new approach should re-enable TSan's ability to find races via interceptors on Darwin. Differential Revision: https://reviews.llvm.org/D29041 llvm-svn: 292981
42 lines
735 B
Plaintext
42 lines
735 B
Plaintext
// Check that calling dispatch_once from a report callback works.
|
|
|
|
// RUN: %clang_tsan %s -o %t -framework Foundation
|
|
// RUN: not %run %t 2>&1 | FileCheck %s
|
|
|
|
#import <Foundation/Foundation.h>
|
|
#import <pthread.h>
|
|
|
|
long g = 0;
|
|
long h = 0;
|
|
void f() {
|
|
static dispatch_once_t onceToken;
|
|
dispatch_once(&onceToken, ^{
|
|
g++;
|
|
});
|
|
h++;
|
|
}
|
|
|
|
extern "C" void __tsan_on_report() {
|
|
fprintf(stderr, "Report.\n");
|
|
f();
|
|
}
|
|
|
|
int main() {
|
|
fprintf(stderr, "Hello world.\n");
|
|
|
|
f();
|
|
|
|
pthread_mutex_t mutex = {0};
|
|
pthread_mutex_lock(&mutex);
|
|
|
|
fprintf(stderr, "g = %ld.\n", g);
|
|
fprintf(stderr, "h = %ld.\n", h);
|
|
fprintf(stderr, "Done.\n");
|
|
}
|
|
|
|
// CHECK: Hello world.
|
|
// CHECK: Report.
|
|
// CHECK: g = 1
|
|
// CHECK: h = 2
|
|
// CHECK: Done.
|