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 23 using namespace __ubsan; 24 25 const char *__ubsan::GetSanititizerToolName() { 26 return "UndefinedBehaviorSanitizer"; 27 } 28 29 static bool ubsan_initialized; 30 static StaticSpinMutex ubsan_init_mu; 31 32 static void CommonInit() { 33 InitializeSuppressions(); 34 } 35 36 static void CommonStandaloneInit() { 37 SanitizerToolName = GetSanititizerToolName(); 38 CacheBinaryName(); 39 InitializeFlags(); 40 __sanitizer_set_report_path(common_flags()->log_path); 41 AndroidLogInit(); 42 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 43 CommonInit(); 44 } 45 46 void __ubsan::InitAsStandalone() { 47 SpinMutexLock l(&ubsan_init_mu); 48 if (!ubsan_initialized) { 49 CommonStandaloneInit(); 50 ubsan_initialized = true; 51 } 52 } 53 54 void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); } 55 56 void __ubsan::InitAsPlugin() { 57 SpinMutexLock l(&ubsan_init_mu); 58 if (!ubsan_initialized) { 59 CommonInit(); 60 ubsan_initialized = true; 61 } 62 } 63 64 #endif // CAN_SANITIZE_UB 65