diff --git a/compiler-rt/lib/ubsan/ubsan_diag.cc b/compiler-rt/lib/ubsan/ubsan_diag.cc index fb5cd4b0aca2..603aee4a3af3 100644 --- a/compiler-rt/lib/ubsan/ubsan_diag.cc +++ b/compiler-rt/lib/ubsan/ubsan_diag.cc @@ -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()); diff --git a/compiler-rt/test/ubsan/TestCases/TypeCheck/Function/function.cpp b/compiler-rt/test/ubsan/TestCases/TypeCheck/Function/function.cpp index 33c2d1c7f9e4..e2f46f2db0a7 100644 --- a/compiler-rt/test/ubsan/TestCases/TypeCheck/Function/function.cpp +++ b/compiler-rt/test/ubsan/TestCases/TypeCheck/Function/function.cpp @@ -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 @@ -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(reinterpret_cast(f))(42); // CHECK-NOT: runtime error: call to function g