ubsan_init.cc revision 276789
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_init.h" 15#include "ubsan_flags.h" 16#include "sanitizer_common/sanitizer_common.h" 17#include "sanitizer_common/sanitizer_libc.h" 18#include "sanitizer_common/sanitizer_mutex.h" 19#include "sanitizer_common/sanitizer_suppressions.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 if (0 == internal_strcmp(SanitizerToolName, "SanitizerTool")) { 35 // WARNING: If this condition holds, then either UBSan runs in a standalone 36 // mode, or initializer for another sanitizer hasn't run yet. In a latter 37 // case, another sanitizer will overwrite "SanitizerToolName" and reparse 38 // common flags. It means, that we are not allowed to *use* common flags 39 // in this function. 40 SanitizerToolName = "UndefinedBehaviorSanitizer"; 41 InitializeCommonFlags(); 42 } 43 // Initialize UBSan-specific flags. 44 InitializeFlags(); 45 SuppressionContext::InitIfNecessary(); 46 ubsan_inited = true; 47} 48 49#if SANITIZER_CAN_USE_PREINIT_ARRAY 50__attribute__((section(".preinit_array"), used)) 51void (*__local_ubsan_preinit)(void) = __ubsan::InitIfNecessary; 52#else 53// Use a dynamic initializer. 54class UbsanInitializer { 55 public: 56 UbsanInitializer() { 57 InitIfNecessary(); 58 } 59}; 60static UbsanInitializer ubsan_initializer; 61#endif // SANITIZER_CAN_USE_PREINIT_ARRAY 62