diff options
author | Alexey Samsonov <vonosmas@gmail.com> | 2014-09-19 18:54:52 +0000 |
---|---|---|
committer | Alexey Samsonov <vonosmas@gmail.com> | 2014-09-19 18:54:52 +0000 |
commit | 462b2be1ece3807b4d954bb474e6d1ee26da6452 (patch) | |
tree | c38d220ee684a009d7cc2a4acaa5f948ad017d13 | |
parent | a82d43abfe5ac2c3067bbd71a17bb94cd5d4ba1f (diff) |
[UBSan] Introduce more flexible __ubsan_default_options function instead of UBSAN_DEFAULT_OPTIONS compile definition
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@218137 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/ubsan/ubsan_flags.cc | 26 | ||||
-rw-r--r-- | lib/ubsan/ubsan_flags.h | 9 | ||||
-rw-r--r-- | test/ubsan/TestCases/TypeCheck/vptr.cpp | 22 |
3 files changed, 36 insertions, 21 deletions
diff --git a/lib/ubsan/ubsan_flags.cc b/lib/ubsan/ubsan_flags.cc index 843f9a6c5..eda11f1b2 100644 --- a/lib/ubsan/ubsan_flags.cc +++ b/lib/ubsan/ubsan_flags.cc @@ -17,23 +17,16 @@ namespace __ubsan { -static const char *GetRuntimeFlagsFromCompileDefinition() { -#ifdef UBSAN_DEFAULT_OPTIONS -// Stringize the macro value -# define UBSAN_STRINGIZE(x) #x -# define UBSAN_STRINGIZE_OPTIONS(options) UBSAN_STRINGIZE(options) - return UBSAN_STRINGIZE_OPTIONS(UBSAN_DEFAULT_OPTIONS); -#else - return ""; -#endif +static const char *MaybeCallUbsanDefaultOptions() { + return (&__ubsan_default_options) ? __ubsan_default_options() : ""; } void InitializeCommonFlags() { CommonFlags *cf = common_flags(); SetCommonFlagsDefaults(cf); cf->print_summary = false; - // Override from compile definition. - ParseCommonFlagsFromString(cf, GetRuntimeFlagsFromCompileDefinition()); + // Override from user-specified string. + ParseCommonFlagsFromString(cf, MaybeCallUbsanDefaultOptions()); // Override from environment variable. ParseCommonFlagsFromString(cf, GetEnv("UBSAN_OPTIONS")); } @@ -54,10 +47,17 @@ void InitializeFlags() { // Default values. f->halt_on_error = false; f->print_stacktrace = false; - // Override from compile definition. - ParseFlagsFromString(f, GetRuntimeFlagsFromCompileDefinition()); + // Override from user-specified string. + ParseFlagsFromString(f, MaybeCallUbsanDefaultOptions()); // Override from environment variable. ParseFlagsFromString(f, GetEnv("UBSAN_OPTIONS")); } } // namespace __ubsan + +#if !SANITIZER_SUPPORTS_WEAK_HOOKS +extern "C" { +SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE +const char *__ubsan_default_options() { return ""; } +} // extern "C" +#endif diff --git a/lib/ubsan/ubsan_flags.h b/lib/ubsan/ubsan_flags.h index 3b1a59e4e..c496469f5 100644 --- a/lib/ubsan/ubsan_flags.h +++ b/lib/ubsan/ubsan_flags.h @@ -13,6 +13,8 @@ #ifndef UBSAN_FLAGS_H #define UBSAN_FLAGS_H +#include "sanitizer_common/sanitizer_internal_defs.h" + namespace __ubsan { struct Flags { @@ -28,4 +30,11 @@ void InitializeFlags(); } // namespace __ubsan +extern "C" { +// Users may provide their own implementation of __ubsan_default_options to +// override the default flag values. +SANITIZER_INTERFACE_ATTRIBUTE SANITIZER_WEAK_ATTRIBUTE +const char *__ubsan_default_options(); +} // extern "C" + #endif // UBSAN_FLAGS_H diff --git a/test/ubsan/TestCases/TypeCheck/vptr.cpp b/test/ubsan/TestCases/TypeCheck/vptr.cpp index 45b7125f8..6d6838781 100644 --- a/test/ubsan/TestCases/TypeCheck/vptr.cpp +++ b/test/ubsan/TestCases/TypeCheck/vptr.cpp @@ -2,14 +2,14 @@ // RUN: %run %t rT && %run %t mT && %run %t fT && %run %t cT // RUN: %run %t rU && %run %t mU && %run %t fU && %run %t cU // RUN: %run %t rS && %run %t rV && %run %t oV -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t mS 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER --strict-whitespace -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t fS 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN --strict-whitespace -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t cS 2>&1 | FileCheck %s --check-prefix=CHECK-DOWNCAST --strict-whitespace -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t mV 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER --strict-whitespace -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t fV 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN --strict-whitespace -// RUN: UBSAN_OPTIONS=print_stacktrace=1 %run %t cV 2>&1 | FileCheck %s --check-prefix=CHECK-DOWNCAST --strict-whitespace -// 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: %run %t mS 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER --strict-whitespace +// RUN: %run %t fS 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN --strict-whitespace +// RUN: %run %t cS 2>&1 | FileCheck %s --check-prefix=CHECK-DOWNCAST --strict-whitespace +// RUN: %run %t mV 2>&1 | FileCheck %s --check-prefix=CHECK-MEMBER --strict-whitespace +// RUN: %run %t fV 2>&1 | FileCheck %s --check-prefix=CHECK-MEMFUN --strict-whitespace +// RUN: %run %t cV 2>&1 | FileCheck %s --check-prefix=CHECK-DOWNCAST --strict-whitespace +// RUN: %run %t oU 2>&1 | FileCheck %s --check-prefix=CHECK-OFFSET --strict-whitespace +// RUN: %run %t m0 2>&1 | FileCheck %s --check-prefix=CHECK-NULL-MEMBER --strict-whitespace // RUN: (echo "vptr_check:S"; echo "vptr_check:T"; echo "vptr_check:U") > %t.supp // RUN: ASAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 UBSAN_OPTIONS=suppressions=%t.supp:halt_on_error=1 %run %t mS 2>&1 @@ -26,6 +26,12 @@ // FIXME: This test produces linker errors on Darwin. // XFAIL: darwin +extern "C" { +const char *__ubsan_default_options() { + return "print_stacktrace=1"; +} +} + struct S { S() : a(0) {} ~S() {} |