diff options
| author | Peter Collingbourne <peter@pcc.me.uk> | 2013-09-10 01:51:35 +0000 |
|---|---|---|
| committer | Peter Collingbourne <peter@pcc.me.uk> | 2013-09-10 01:51:35 +0000 |
| commit | 0dca2e5ed11a25f8eda7dd83b4d3168bcfaab6a2 (patch) | |
| tree | da46c04565599bdc18788021d089632efe3db4c1 /compiler-rt | |
| parent | 81f74480b3d8f10f995265f41d5ae80dcdb9af56 (diff) | |
| download | bcm5719-llvm-0dca2e5ed11a25f8eda7dd83b4d3168bcfaab6a2.tar.gz bcm5719-llvm-0dca2e5ed11a25f8eda7dd83b4d3168bcfaab6a2.zip | |
[dfsan] Initial set of DFSAN_OPTIONS flags.
llvm-svn: 190379
Diffstat (limited to 'compiler-rt')
| -rw-r--r-- | compiler-rt/lib/dfsan/dfsan.cc | 23 | ||||
| -rw-r--r-- | compiler-rt/lib/dfsan/dfsan.h | 12 | ||||
| -rw-r--r-- | compiler-rt/lib/dfsan/lit_tests/Inputs/flags_abilist.txt | 10 | ||||
| -rw-r--r-- | compiler-rt/lib/dfsan/lit_tests/flags.c | 24 |
4 files changed, 66 insertions, 3 deletions
diff --git a/compiler-rt/lib/dfsan/dfsan.cc b/compiler-rt/lib/dfsan/dfsan.cc index c4d13f7d7cc..76c392d14b1 100644 --- a/compiler-rt/lib/dfsan/dfsan.cc +++ b/compiler-rt/lib/dfsan/dfsan.cc @@ -22,6 +22,7 @@ #include "sanitizer/dfsan_interface.h" #include "sanitizer_common/sanitizer_atomic.h" #include "sanitizer_common/sanitizer_common.h" +#include "sanitizer_common/sanitizer_flags.h" #include "sanitizer_common/sanitizer_libc.h" #include "dfsan/dfsan.h" @@ -36,6 +37,8 @@ static const uptr kNumLabels = 1 << (sizeof(dfsan_label) * 8); static atomic_dfsan_label __dfsan_last_label; static dfsan_label_info __dfsan_label_info[kNumLabels]; +Flags __dfsan::flags_data; + SANITIZER_INTERFACE_ATTRIBUTE THREADLOCAL dfsan_label __dfsan_retval_tls; SANITIZER_INTERFACE_ATTRIBUTE THREADLOCAL dfsan_label __dfsan_arg_tls[64]; @@ -132,14 +135,18 @@ dfsan_label __dfsan_union_load(const dfsan_label *ls, size_t n) { extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __dfsan_unimplemented(char *fname) { - Report("WARNING: DataFlowSanitizer: call to uninstrumented function %s\n", - fname); + if (flags().warn_unimplemented) + Report("WARNING: DataFlowSanitizer: call to uninstrumented function %s\n", + fname); } // Use '-mllvm -dfsan-debug-nonzero-labels' and break on this function // to try to figure out where labels are being introduced in a nominally // label-free program. -extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __dfsan_nonzero_label() {} +extern "C" SANITIZER_INTERFACE_ATTRIBUTE void __dfsan_nonzero_label() { + if (flags().warn_nonzero_labels) + Report("WARNING: DataFlowSanitizer: saw nonzero label\n"); +} // Like __dfsan_union, but for use from the client or custom functions. Hence // the equality comparison is done here before calling __dfsan_union. @@ -222,6 +229,14 @@ dfsan_label dfsan_has_label_with_desc(dfsan_label label, const char *desc) { } } +static void InitializeFlags(Flags &f, const char *env) { + f.warn_unimplemented = true; + f.warn_nonzero_labels = false; + + ParseFlag(env, &f.warn_unimplemented, "warn_unimplemented"); + ParseFlag(env, &f.warn_nonzero_labels, "warn_nonzero_labels"); +} + #ifdef DFSAN_NOLIBC extern "C" void dfsan_init() { #else @@ -238,6 +253,8 @@ static void dfsan_init(int argc, char **argv, char **envp) { if (!(init_addr >= kUnusedAddr && init_addr < kAppAddr)) Mprotect(kUnusedAddr, kAppAddr - kUnusedAddr); + InitializeFlags(flags(), GetEnv("DFSAN_OPTIONS")); + InitializeInterceptors(); } diff --git a/compiler-rt/lib/dfsan/dfsan.h b/compiler-rt/lib/dfsan/dfsan.h index 0be55aa71a6..7d023ed322c 100644 --- a/compiler-rt/lib/dfsan/dfsan.h +++ b/compiler-rt/lib/dfsan/dfsan.h @@ -29,6 +29,18 @@ inline const dfsan_label *shadow_for(const void *ptr) { return shadow_for(const_cast<void *>(ptr)); } +struct Flags { + // Whether to warn on unimplemented functions. + bool warn_unimplemented; + // Whether to warn on non-zero labels. + bool warn_nonzero_labels; +}; + +extern Flags flags_data; +inline Flags &flags() { + return flags_data; +} + } // namespace __dfsan #endif // DFSAN_H diff --git a/compiler-rt/lib/dfsan/lit_tests/Inputs/flags_abilist.txt b/compiler-rt/lib/dfsan/lit_tests/Inputs/flags_abilist.txt new file mode 100644 index 00000000000..94b1fa29825 --- /dev/null +++ b/compiler-rt/lib/dfsan/lit_tests/Inputs/flags_abilist.txt @@ -0,0 +1,10 @@ +fun:f=uninstrumented + +fun:main=uninstrumented +fun:main=discard + +fun:dfsan_create_label=uninstrumented +fun:dfsan_create_label=discard + +fun:dfsan_set_label=uninstrumented +fun:dfsan_set_label=discard diff --git a/compiler-rt/lib/dfsan/lit_tests/flags.c b/compiler-rt/lib/dfsan/lit_tests/flags.c new file mode 100644 index 00000000000..5cf970dce90 --- /dev/null +++ b/compiler-rt/lib/dfsan/lit_tests/flags.c @@ -0,0 +1,24 @@ +// RUN: %clang_dfsan -m64 %s -fsanitize-blacklist=%S/Inputs/flags_abilist.txt -mllvm -dfsan-debug-nonzero-labels -o %t && %t 2>&1 | FileCheck %s +// RUN: %clang_dfsan -m64 %s -fsanitize-blacklist=%S/Inputs/flags_abilist.txt -mllvm -dfsan-debug-nonzero-labels -o %t && DFSAN_OPTIONS=warn_unimplemented=0 %t 2>&1 | count 0 +// RUN: %clang_dfsan -m64 %s -fsanitize-blacklist=%S/Inputs/flags_abilist.txt -mllvm -dfsan-debug-nonzero-labels -o %t && DFSAN_OPTIONS=warn_nonzero_labels=1 %t 2>&1 | FileCheck --check-prefix=CHECK-NONZERO %s + +// Tests that flags work correctly. + +#include <sanitizer/dfsan_interface.h> + +int f(int i) { + return i; +} + +int main(void) { + int i = 1; + dfsan_label i_label = dfsan_create_label("i", 0); + dfsan_set_label(i_label, &i, sizeof(i)); + + // CHECK: WARNING: DataFlowSanitizer: call to uninstrumented function f + // CHECK-NOT: WARNING: DataFlowSanitizer: saw nonzero label + // CHECK-NONZERO: WARNING: DataFlowSanitizer: saw nonzero label + f(i); + + return 0; +} |

