1*ff6d591cSmrg //===-- ubsan_init.cpp ----------------------------------------------------===// 2*ff6d591cSmrg // 3*ff6d591cSmrg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*ff6d591cSmrg // See https://llvm.org/LICENSE.txt for license information. 5*ff6d591cSmrg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*ff6d591cSmrg // 7*ff6d591cSmrg //===----------------------------------------------------------------------===// 8*ff6d591cSmrg // 9*ff6d591cSmrg // Initialization of UBSan runtime. 10*ff6d591cSmrg // 11*ff6d591cSmrg //===----------------------------------------------------------------------===// 12*ff6d591cSmrg 13*ff6d591cSmrg #include "ubsan_platform.h" 14*ff6d591cSmrg #if CAN_SANITIZE_UB 15*ff6d591cSmrg #include "ubsan_diag.h" 16*ff6d591cSmrg #include "ubsan_init.h" 17*ff6d591cSmrg #include "ubsan_flags.h" 18*ff6d591cSmrg #include "sanitizer_common/sanitizer_common.h" 19*ff6d591cSmrg #include "sanitizer_common/sanitizer_libc.h" 20*ff6d591cSmrg #include "sanitizer_common/sanitizer_mutex.h" 21*ff6d591cSmrg #include "sanitizer_common/sanitizer_symbolizer.h" 22*ff6d591cSmrg 23*ff6d591cSmrg using namespace __ubsan; 24*ff6d591cSmrg GetSanititizerToolName()25*ff6d591cSmrgconst char *__ubsan::GetSanititizerToolName() { 26*ff6d591cSmrg return "UndefinedBehaviorSanitizer"; 27*ff6d591cSmrg } 28*ff6d591cSmrg 29*ff6d591cSmrg static bool ubsan_initialized; 30*ff6d591cSmrg static StaticSpinMutex ubsan_init_mu; 31*ff6d591cSmrg CommonInit()32*ff6d591cSmrgstatic void CommonInit() { 33*ff6d591cSmrg InitializeSuppressions(); 34*ff6d591cSmrg } 35*ff6d591cSmrg UbsanDie()36*ff6d591cSmrgstatic void UbsanDie() { 37*ff6d591cSmrg if (common_flags()->print_module_map >= 1) 38*ff6d591cSmrg DumpProcessMap(); 39*ff6d591cSmrg } 40*ff6d591cSmrg CommonStandaloneInit()41*ff6d591cSmrgstatic void CommonStandaloneInit() { 42*ff6d591cSmrg SanitizerToolName = GetSanititizerToolName(); 43*ff6d591cSmrg CacheBinaryName(); 44*ff6d591cSmrg InitializeFlags(); 45*ff6d591cSmrg __sanitizer::InitializePlatformEarly(); 46*ff6d591cSmrg __sanitizer_set_report_path(common_flags()->log_path); 47*ff6d591cSmrg AndroidLogInit(); 48*ff6d591cSmrg InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 49*ff6d591cSmrg CommonInit(); 50*ff6d591cSmrg 51*ff6d591cSmrg // Only add die callback when running in standalone mode to avoid printing 52*ff6d591cSmrg // the same information from multiple sanitizers' output 53*ff6d591cSmrg AddDieCallback(UbsanDie); 54*ff6d591cSmrg Symbolizer::LateInitialize(); 55*ff6d591cSmrg } 56*ff6d591cSmrg InitAsStandalone()57*ff6d591cSmrgvoid __ubsan::InitAsStandalone() { 58*ff6d591cSmrg SpinMutexLock l(&ubsan_init_mu); 59*ff6d591cSmrg if (!ubsan_initialized) { 60*ff6d591cSmrg CommonStandaloneInit(); 61*ff6d591cSmrg ubsan_initialized = true; 62*ff6d591cSmrg } 63*ff6d591cSmrg } 64*ff6d591cSmrg InitAsStandaloneIfNecessary()65*ff6d591cSmrgvoid __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 66*ff6d591cSmrg InitAsPlugin()67*ff6d591cSmrgvoid __ubsan::InitAsPlugin() { 68*ff6d591cSmrg SpinMutexLock l(&ubsan_init_mu); 69*ff6d591cSmrg if (!ubsan_initialized) { 70*ff6d591cSmrg CommonInit(); 71*ff6d591cSmrg ubsan_initialized = true; 72*ff6d591cSmrg } 73*ff6d591cSmrg } 74*ff6d591cSmrg 75*ff6d591cSmrg #endif // CAN_SANITIZE_UB 76