Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[sanitizer] On OS X, verify that interceptors work and abort if not
On OS X 10.11+, we have "automatic interceptors", so we don't need to use DYLD_INSERT_LIBRARIES when launching instrumented programs. However, non-instrumented programs that load TSan late (e.g. via dlopen) are currently broken, as TSan will still try to initialize, but the program will crash/hang at random places (because the interceptors don't work). This patch adds an explicit check that interceptors are working, and if not, it aborts and prints out an error message suggesting to explicitly use DYLD_INSERT_LIBRARIES. Differential Revision: http://reviews.llvm.org/D18121 llvm-svn: 263551
- Loading branch information
1 parent
96f4b12
commit 69b5943
Showing
3 changed files
with
64 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
// Checks that on OS X 10.11+ (where we do not re-exec anymore, because | ||
// interceptors work automatically), dlopen'ing a TSanified library from a | ||
// non-instrumented program exits with a user-friendly message. | ||
|
||
// REQUIRES: osx-autointerception | ||
|
||
// RUN: %clangxx_tsan %s -o %t.so -shared -DSHARED_LIB | ||
// RUN: %clangxx_tsan -fno-sanitize=thread %s -o %t | ||
|
||
// RUN: TSAN_DYLIB_PATH=`%clangxx_tsan %s -### 2>&1 \ | ||
// RUN: | grep "libclang_rt.tsan_osx_dynamic.dylib" \ | ||
// RUN: | sed -e 's/.*"\(.*libclang_rt.tsan_osx_dynamic.dylib\)".*/\1/'` | ||
|
||
// Launching a non-instrumented binary that dlopen's an instrumented library should fail. | ||
// RUN: not %run %t-noninstr %t.so 2>&1 | FileCheck %s --check-prefix=CHECK-FAIL | ||
// Launching a non-instrumented binary with an explicit DYLD_INSERT_LIBRARIES should work. | ||
// RUN: DYLD_INSERT_LIBRARIES=$TSAN_DYLIB_PATH %run %t-noninstr %t.so 2>&1 | FileCheck %s | ||
|
||
#include <dlfcn.h> | ||
#include <pthread.h> | ||
#include <stdio.h> | ||
|
||
#if defined(SHARED_LIB) | ||
void foo() { | ||
fprintf(stderr, "Hello world.\n"); | ||
} | ||
#else // defined(SHARED_LIB) | ||
int main(int argc, char *argv[]) { | ||
void *handle = dlopen(argv[1], RTLD_NOW); | ||
fprintf(stderr, "handle = %p\n", handle); | ||
void (*foo)() = (void (*)())dlsym(handle, "foo"); | ||
fprintf(stderr, "foo = %p\n", foo); | ||
foo(); | ||
} | ||
#endif // defined(SHARED_LIB) | ||
|
||
// CHECK: Hello world. | ||
// CHECK-NOT: ERROR: Interceptors are not working. | ||
|
||
// CHECK-FAIL-NOT: Hello world. | ||
// CHECK-FAIL: ERROR: Interceptors are not working. |