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