#include "ubsan_init.h"
#include "ubsan_flags.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_libc.h"
#include "sanitizer_common/sanitizer_mutex.h"
#include "sanitizer_common/sanitizer_suppressions.h"
#include "sanitizer_common/sanitizer_symbolizer.h"
using namespace __ubsan;
static bool ubsan_inited;
void __ubsan::InitIfNecessary() {
#if !SANITIZER_CAN_USE_PREINIT_ARRAY
static StaticSpinMutex init_mu;
SpinMutexLock l(&init_mu);
#endif
if (LIKELY(ubsan_inited))
return;
bool standalone = false;
if (0 == internal_strcmp(SanitizerToolName, "SanitizerTool")) {
SanitizerToolName = "UndefinedBehaviorSanitizer";
standalone = true;
}
InitializeFlags(standalone);
SuppressionContext::InitIfNecessary();
InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
ubsan_inited = true;
}
#if SANITIZER_CAN_USE_PREINIT_ARRAY
__attribute__((section(".preinit_array"), used))
void (*__local_ubsan_preinit)(void) = __ubsan::InitIfNecessary;
#else
class UbsanInitializer {
public:
UbsanInitializer() {
InitIfNecessary();
}
};
static UbsanInitializer ubsan_initializer;
#endif // SANITIZER_CAN_USE_PREINIT_ARRAY