diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2013-10-03 13:37:17 +0000 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2013-10-03 13:37:17 +0000 |
| commit | 5ba736457c94580b9cf8a0a65fccf9a89da0b1a6 (patch) | |
| tree | afa352b57a63c0e8b42932077375b7c6310a3515 /compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc | |
| parent | d2757ba1be2915c8f41dd850ffdda8ff6a673382 (diff) | |
| download | bcm5719-llvm-5ba736457c94580b9cf8a0a65fccf9a89da0b1a6.tar.gz bcm5719-llvm-5ba736457c94580b9cf8a0a65fccf9a89da0b1a6.zip | |
tsan: ignore interceptors coming from specified libraries
LibIgnore allows to ignore all interceptors called from a particular set
of dynamic libraries. LibIgnore remembers all "called_from_lib" suppressions
from the provided SuppressionContext; finds code ranges for the libraries;
and checks whether the provided PC value belongs to the code ranges.
Also make malloc and friends interceptors use SCOPED_INTERCEPTOR_RAW instead of
SCOPED_TSAN_INTERCEPTOR, because if they are called from an ignored lib,
then must call our internal allocator instead of libc malloc.
llvm-svn: 191897
Diffstat (limited to 'compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc')
| -rw-r--r-- | compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc b/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc new file mode 100644 index 00000000000..c4f2e734413 --- /dev/null +++ b/compiler-rt/lib/tsan/lit_tests/ignore_lib1.cc @@ -0,0 +1,42 @@ +// RUN: %clangxx_tsan -O1 %s -DLIB -fPIC -fno-sanitize=thread -shared -o %T/libignore_lib1.so +// RUN: %clangxx_tsan -O1 %s -o %t +// RUN: echo running w/o suppressions: +// RUN: not %t 2>&1 | FileCheck %s --check-prefix=CHECK-NOSUPP +// RUN: echo running with suppressions: +// RUN: TSAN_OPTIONS="$TSAN_OPTIONS suppressions=%s.supp" %t 2>&1 | FileCheck %s --check-prefix=CHECK-WITHSUPP + +// Tests that interceptors coming from a dynamically loaded library specified +// in called_from_lib suppression are ignored. + +#ifndef LIB + +#include <dlfcn.h> +#include <stdlib.h> +#include <stdio.h> +#include <errno.h> +#include <libgen.h> +#include <string> + +int main(int argc, char **argv) { + std::string lib = std::string(dirname(argv[0])) + "/libignore_lib1.so"; + void *h = dlopen(lib.c_str(), RTLD_GLOBAL | RTLD_NOW); + if (h == 0) + exit(printf("failed to load the library (%d)\n", errno)); + void (*f)() = (void(*)())dlsym(h, "libfunc"); + if (f == 0) + exit(printf("failed to find the func (%d)\n", errno)); + f(); +} + +#else // #ifdef LIB + +#include "ignore_lib_lib.h" + +#endif // #ifdef LIB + +// CHECK-NOSUPP: WARNING: ThreadSanitizer: data race +// CHECK-NOSUPP: OK + +// CHECK-WITHSUPP-NOT: WARNING: ThreadSanitizer: data race +// CHECK-WITHSUPP: OK + |

