[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:
Alexey Samsonov 2014-07-23 18:32:55 +00:00
parent d75303581f
commit cd875aa551
2 changed files with 10 additions and 4 deletions

View File

@ -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());

View File

@ -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