Files
llvm-project/compiler-rt/lib/ubsan/ubsan_init.cpp
Dmitry Vyukov 595d340dce sanitizer_common: make internal/external headers compatible
This is a follow up to 4f3f4d6722
("sanitizer_common: fix __sanitizer_get_module_and_offset_for_pc signature mismatch")
which fixes a similar problem for msan build.

I am getting the following error compiling a unit test for code that
uses sanitizer_common headers and googletest transitively includes
sanitizer interface headers:

In file included from third_party/gwp_sanitizers/singlestep_test.cpp:3:
In file included from sanitizer_common/sanitizer_common.h:19:
sanitizer_interface_internal.h:41:5: error: typedef redefinition with different types
('struct __sanitizer_sandbox_arguments' vs 'struct __sanitizer_sandbox_arguments')
  } __sanitizer_sandbox_arguments;
common_interface_defs.h:39:3: note: previous definition is here
} __sanitizer_sandbox_arguments;

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D119546
2022-02-11 19:39:44 +01:00

77 lines
2.1 KiB
C++

//===-- ubsan_init.cpp ----------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// Initialization of UBSan runtime.
//
//===----------------------------------------------------------------------===//
#include "ubsan_platform.h"
#if CAN_SANITIZE_UB
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_interface_internal.h"
#include "sanitizer_common/sanitizer_libc.h"
#include "sanitizer_common/sanitizer_mutex.h"
#include "sanitizer_common/sanitizer_symbolizer.h"
#include "ubsan_diag.h"
#include "ubsan_flags.h"
#include "ubsan_init.h"
using namespace __ubsan;
const char *__ubsan::GetSanititizerToolName() {
return "UndefinedBehaviorSanitizer";
}
static bool ubsan_initialized;
static StaticSpinMutex ubsan_init_mu;
static void CommonInit() {
InitializeSuppressions();
}
static void UbsanDie() {
if (common_flags()->print_module_map >= 1)
DumpProcessMap();
}
static void CommonStandaloneInit() {
SanitizerToolName = GetSanititizerToolName();
CacheBinaryName();
InitializeFlags();
__sanitizer::InitializePlatformEarly();
__sanitizer_set_report_path(common_flags()->log_path);
AndroidLogInit();
InitializeCoverage(common_flags()->coverage, common_flags()->coverage_dir);
CommonInit();
// Only add die callback when running in standalone mode to avoid printing
// the same information from multiple sanitizers' output
AddDieCallback(UbsanDie);
Symbolizer::LateInitialize();
}
void __ubsan::InitAsStandalone() {
SpinMutexLock l(&ubsan_init_mu);
if (!ubsan_initialized) {
CommonStandaloneInit();
ubsan_initialized = true;
}
}
void __ubsan::InitAsStandaloneIfNecessary() { return InitAsStandalone(); }
void __ubsan::InitAsPlugin() {
SpinMutexLock l(&ubsan_init_mu);
if (!ubsan_initialized) {
CommonInit();
ubsan_initialized = true;
}
}
#endif // CAN_SANITIZE_UB