forked from OSchip/llvm-project
[UBSan] Introduce UBSAN_OPTIONS environment variable.
If UBSan is run in a standalone mode (w/o any other sanitizer), it still uses functions from sanitizer_common, some of which depend on the value of runtime flags. Allow to override the default values of these flags with UBSAN_OPTIONS variable. In particular, UBSAN_OPTIONS=symbolize=0 can be used to turn off online symbolization. llvm-svn: 213782
This commit is contained in:
parent
d75303581f
commit
cd875aa551
|
@ -22,7 +22,7 @@
|
|||
|
||||
using namespace __ubsan;
|
||||
|
||||
static void InitializeSanitizerCommon() {
|
||||
static void InitializeSanitizerCommonAndFlags() {
|
||||
static StaticSpinMutex init_mu;
|
||||
SpinMutexLock l(&init_mu);
|
||||
static bool initialized;
|
||||
|
@ -34,6 +34,8 @@ static void InitializeSanitizerCommon() {
|
|||
CommonFlags *cf = common_flags();
|
||||
SetCommonFlagsDefaults(cf);
|
||||
cf->print_summary = false;
|
||||
// Common flags may only be modified via UBSAN_OPTIONS.
|
||||
ParseCommonFlagsFromString(cf, GetEnv("UBSAN_OPTIONS"));
|
||||
}
|
||||
initialized = true;
|
||||
}
|
||||
|
@ -60,7 +62,7 @@ Location __ubsan::getCallerLocation(uptr CallerLoc) {
|
|||
Location __ubsan::getFunctionLocation(uptr Loc, const char **FName) {
|
||||
if (!Loc)
|
||||
return Location();
|
||||
InitializeSanitizerCommon();
|
||||
InitializeSanitizerCommonAndFlags();
|
||||
|
||||
AddressInfo Info;
|
||||
if (!Symbolizer::GetOrInit()->SymbolizePC(Loc, &Info, 1) ||
|
||||
|
@ -274,7 +276,7 @@ static void renderMemorySnippet(const Decorator &Decor, MemoryLocation Loc,
|
|||
}
|
||||
|
||||
Diag::~Diag() {
|
||||
InitializeSanitizerCommon();
|
||||
InitializeSanitizerCommonAndFlags();
|
||||
Decorator Decor;
|
||||
SpinMutexLock l(&CommonSanitizerReportMutex);
|
||||
Printf(Decor.Bold());
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
// RUN: %clangxx -fsanitize=function %s -O3 -g -o %t
|
||||
// RUN: %run %t 2>&1 | FileCheck %s
|
||||
// Verify that we can disable symbolization if needed:
|
||||
// RUN: UBSAN_OPTIONS=symbolize=0 ASAN_OPTIONS=symbolize=0 %run %t 2>&1 | FileCheck %s --check-prefix=NOSYM
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
|
@ -9,7 +11,9 @@ void g(int x) {}
|
|||
|
||||
int main(void) {
|
||||
// CHECK: runtime error: call to function f() through pointer to incorrect function type 'void (*)(int)'
|
||||
// CHECK-NEXT: function.cpp:6: note: f() defined here
|
||||
// CHECK-NEXT: function.cpp:8: note: f() defined here
|
||||
// NOSYM: runtime error: call to function (unknown) through pointer to incorrect function type 'void (*)(int)'
|
||||
// NOSYM-NEXT: ({{.*}}+0x{{.*}}): note: (unknown) defined here
|
||||
reinterpret_cast<void (*)(int)>(reinterpret_cast<uintptr_t>(f))(42);
|
||||
|
||||
// CHECK-NOT: runtime error: call to function g
|
||||
|
|
Loading…
Reference in New Issue