diff options
| author | Alexey Samsonov <vonosmas@gmail.com> | 2014-09-10 19:35:31 +0000 |
|---|---|---|
| committer | Alexey Samsonov <vonosmas@gmail.com> | 2014-09-10 19:35:31 +0000 |
| commit | b69d5dffc3e55c11b33fae6df331ede3d1e48305 (patch) | |
| tree | 70bb8dbffcd3c81a5bff24be5453459a20066056 | |
| parent | 7b556ead93561522b88d926230db1bba26a9f62e (diff) | |
| download | bcm5719-llvm-b69d5dffc3e55c11b33fae6df331ede3d1e48305.tar.gz bcm5719-llvm-b69d5dffc3e55c11b33fae6df331ede3d1e48305.zip | |
[UBSan] Add halt_on_error runtime flag
llvm-svn: 217535
| -rw-r--r-- | compiler-rt/lib/ubsan/ubsan_diag.cc | 2 | ||||
| -rw-r--r-- | compiler-rt/lib/ubsan/ubsan_flags.cc | 3 | ||||
| -rw-r--r-- | compiler-rt/lib/ubsan/ubsan_flags.h | 1 | ||||
| -rw-r--r-- | compiler-rt/test/ubsan/TestCases/TypeCheck/vptr.cpp | 17 |
4 files changed, 13 insertions, 10 deletions
diff --git a/compiler-rt/lib/ubsan/ubsan_diag.cc b/compiler-rt/lib/ubsan/ubsan_diag.cc index 26f34376f50..f719998106c 100644 --- a/compiler-rt/lib/ubsan/ubsan_diag.cc +++ b/compiler-rt/lib/ubsan/ubsan_diag.cc @@ -309,7 +309,7 @@ ScopedReport::ScopedReport(ReportOptions Opts) : Opts(Opts) { ScopedReport::~ScopedReport() { MaybePrintStackTrace(Opts.pc, Opts.bp); CommonSanitizerReportMutex.Unlock(); - if (Opts.DieAfterReport) + if (Opts.DieAfterReport || flags()->halt_on_error) Die(); } diff --git a/compiler-rt/lib/ubsan/ubsan_flags.cc b/compiler-rt/lib/ubsan/ubsan_flags.cc index 65b40ff51be..843f9a6c591 100644 --- a/compiler-rt/lib/ubsan/ubsan_flags.cc +++ b/compiler-rt/lib/ubsan/ubsan_flags.cc @@ -43,6 +43,8 @@ Flags ubsan_flags; static void ParseFlagsFromString(Flags *f, const char *str) { if (!str) return; + ParseFlag(str, &f->halt_on_error, "halt_on_error", + "Crash the program after printing the first error report"); ParseFlag(str, &f->print_stacktrace, "print_stacktrace", "Include full stacktrace into an error report"); } @@ -50,6 +52,7 @@ static void ParseFlagsFromString(Flags *f, const char *str) { void InitializeFlags() { Flags *f = flags(); // Default values. + f->halt_on_error = false; f->print_stacktrace = false; // Override from compile definition. ParseFlagsFromString(f, GetRuntimeFlagsFromCompileDefinition()); diff --git a/compiler-rt/lib/ubsan/ubsan_flags.h b/compiler-rt/lib/ubsan/ubsan_flags.h index c8cbabf7138..3b1a59e4e19 100644 --- a/compiler-rt/lib/ubsan/ubsan_flags.h +++ b/compiler-rt/lib/ubsan/ubsan_flags.h @@ -16,6 +16,7 @@ namespace __ubsan { struct Flags { + bool halt_on_error; bool print_stacktrace; }; diff --git a/compiler-rt/test/ubsan/TestCases/TypeCheck/vptr.cpp b/compiler-rt/test/ubsan/TestCases/TypeCheck/vptr.cpp index 3d616ee852d..45b7125f845 100644 --- a/compiler-rt/test/ubsan/TestCases/TypeCheck/vptr.cpp +++ b/compiler-rt/test/ubsan/TestCases/TypeCheck/vptr.cpp @@ -11,18 +11,17 @@ // RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t oU 2>&1 | FileCheck %s --check-prefix=CHECK-OFFSET --strict-whitespace // RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t m0 2>&1 | FileCheck %s --check-prefix=CHECK-NULL-MEMBER --strict-whitespace -// RUN: %clangxx -fsanitize=vptr -fno-sanitize-recover -g %s -O3 -o %t // RUN: (echo "vptr_check:S"; echo "vptr_check:T"; echo "vptr_check:U") > %t.supp -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t mS 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t fS 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t cS 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t mV 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t fV 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t cV 2>&1 -// RUN: ASAN_OPTIONS=suppressions=%t.supp UBSAN_OPTIONS=suppressions=%t.supp %run %t oU 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t mS 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t fS 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t cS 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t mV 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t fV 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t cV 2>&1 +// RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t oU 2>&1 // RUN: echo "vptr_check:S" > %t.loc-supp -// RUN: ASAN_OPTIONS=suppressions=%t.loc-supp UBSAN_OPTIONS=suppressions=%t.loc-supp not %run %t x- 2>&1 | FileCheck %s --check-prefix=CHECK-LOC-SUPPRESS +// RUN: ASAN_OPTIONS=suppressions=%t.loc-supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.loc-supp:halt_on_error=1 not %run %t x- 2>&1 | FileCheck %s --check-prefix=CHECK-LOC-SUPPRESS // FIXME: This test produces linker errors on Darwin. // XFAIL: darwin |

