using namespace __ubsan;
-static void InitializeSanitizerCommon() {
+static void InitializeSanitizerCommonAndFlags() {
static StaticSpinMutex init_mu;
SpinMutexLock l(&init_mu);
static bool initialized;
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;
}
Location __ubsan::getFunctionLocation(uptr Loc, const char **FName) {
if (!Loc)
return Location();
- InitializeSanitizerCommon();
+ InitializeSanitizerCommonAndFlags();
AddressInfo Info;
if (!Symbolizer::GetOrInit()->SymbolizePC(Loc, &Info, 1) ||
}
Diag::~Diag() {
- InitializeSanitizerCommon();
+ InitializeSanitizerCommonAndFlags();
Decorator Decor;
SpinMutexLock l(&CommonSanitizerReportMutex);
Printf(Decor.Bold());
// 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>
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