ubsan_init.cc revision 280031
1//===-- ubsan_init.cc -----------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// Initialization of UBSan runtime. 11// 12//===----------------------------------------------------------------------===// 13 14#include "ubsan_diag.h" 15#include "ubsan_init.h" 16#include "ubsan_flags.h" 17#include "sanitizer_common/sanitizer_common.h" 18#include "sanitizer_common/sanitizer_libc.h" 19#include "sanitizer_common/sanitizer_mutex.h" 20#include "sanitizer_common/sanitizer_symbolizer.h" 21 22using namespace __ubsan; 23 24static bool ubsan_inited; 25 26void __ubsan::InitIfNecessary() { 27#if !SANITIZER_CAN_USE_PREINIT_ARRAY 28 // No need to lock mutex if we're initializing from preinit array. 29 static StaticSpinMutex init_mu; 30 SpinMutexLock l(&init_mu); 31#endif 32 if (LIKELY(ubsan_inited)) 33 return; 34 bool standalone = false; 35 if (0 == internal_strcmp(SanitizerToolName, "SanitizerTool")) { 36 // WARNING: If this condition holds, then either UBSan runs in a standalone 37 // mode, or initializer for another sanitizer hasn't run yet. In a latter 38 // case, another sanitizer will overwrite "SanitizerToolName" and reparse 39 // common flags. It means, that we are not allowed to *use* common flags 40 // in this function. 41 SanitizerToolName = "UndefinedBehaviorSanitizer"; 42 standalone = true; 43 } 44 // Initialize UBSan-specific flags. 45 InitializeFlags(standalone); 46 InitializeSuppressions(); 47 InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir); 48 ubsan_inited = true; 49} 50 51#if SANITIZER_CAN_USE_PREINIT_ARRAY 52__attribute__((section(".preinit_array"), used)) 53void (*__local_ubsan_preinit)(void) = __ubsan::InitIfNecessary; 54#else 55// Use a dynamic initializer. 56class UbsanInitializer { 57 public: 58 UbsanInitializer() { 59 InitIfNecessary(); 60 } 61}; 62static UbsanInitializer ubsan_initializer; 63#endif // SANITIZER_CAN_USE_PREINIT_ARRAY 64