forked from OSchip/llvm-project
ubsan: Allow programs to use setenv to configure ubsan_standalone.
Previously ubsan_standalone used the GetEnv function to read the environment variables UBSAN_OPTIONS and UBSAN_SYMBOLIZER_PATH. The problem with GetEnv is that it does not respect changes to the environment variables made using the libc setenv function, which prevents clients from setting environment variables to configure ubsan before loading ubsan-instrumented libraries. The reason why we have GetEnv is that some runtimes need to read environment variables while they initialize using .preinit_array, and getenv does not work while .preinit_array functions are being called. However, it is unnecessary for ubsan_standalone to initialize that early. So this change switches ubsan_standalone to using getenv and removes the .preinit_array entry. The static version of the runtime still ends up being initialized using a C++ constructor that exists to support the shared runtime. Differential Revision: https://reviews.llvm.org/D39827 llvm-svn: 317757
This commit is contained in:
parent
e1d121d715
commit
c6721f580d
|
@ -151,7 +151,6 @@ else()
|
||||||
add_compiler_rt_runtime(clang_rt.ubsan_standalone
|
add_compiler_rt_runtime(clang_rt.ubsan_standalone
|
||||||
STATIC
|
STATIC
|
||||||
ARCHS ${UBSAN_SUPPORTED_ARCH}
|
ARCHS ${UBSAN_SUPPORTED_ARCH}
|
||||||
SOURCES ubsan_init_standalone_preinit.cc
|
|
||||||
OBJECT_LIBS RTSanitizerCommon
|
OBJECT_LIBS RTSanitizerCommon
|
||||||
RTSanitizerCommonLibc
|
RTSanitizerCommonLibc
|
||||||
RTUbsan
|
RTUbsan
|
||||||
|
|
|
@ -18,6 +18,8 @@
|
||||||
#include "sanitizer_common/sanitizer_flags.h"
|
#include "sanitizer_common/sanitizer_flags.h"
|
||||||
#include "sanitizer_common/sanitizer_flag_parser.h"
|
#include "sanitizer_common/sanitizer_flag_parser.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
namespace __ubsan {
|
namespace __ubsan {
|
||||||
|
|
||||||
const char *MaybeCallUbsanDefaultOptions() {
|
const char *MaybeCallUbsanDefaultOptions() {
|
||||||
|
@ -45,7 +47,7 @@ void InitializeFlags() {
|
||||||
CommonFlags cf;
|
CommonFlags cf;
|
||||||
cf.CopyFrom(*common_flags());
|
cf.CopyFrom(*common_flags());
|
||||||
cf.print_summary = false;
|
cf.print_summary = false;
|
||||||
cf.external_symbolizer_path = GetEnv("UBSAN_SYMBOLIZER_PATH");
|
cf.external_symbolizer_path = getenv("UBSAN_SYMBOLIZER_PATH");
|
||||||
OverrideCommonFlags(cf);
|
OverrideCommonFlags(cf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,7 +61,7 @@ void InitializeFlags() {
|
||||||
// Override from user-specified string.
|
// Override from user-specified string.
|
||||||
parser.ParseString(MaybeCallUbsanDefaultOptions());
|
parser.ParseString(MaybeCallUbsanDefaultOptions());
|
||||||
// Override from environment variable.
|
// Override from environment variable.
|
||||||
parser.ParseString(GetEnv("UBSAN_OPTIONS"));
|
parser.ParseString(getenv("UBSAN_OPTIONS"));
|
||||||
InitializeCommonFlags();
|
InitializeCommonFlags();
|
||||||
if (Verbosity()) ReportUnrecognizedFlags();
|
if (Verbosity()) ReportUnrecognizedFlags();
|
||||||
|
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
//===-- ubsan_init_standalone_preinit.cc
|
|
||||||
//------------------------------------------===//
|
|
||||||
//
|
|
||||||
// The LLVM Compiler Infrastructure
|
|
||||||
//
|
|
||||||
// This file is distributed under the University of Illinois Open Source
|
|
||||||
// License. See LICENSE.TXT for details.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
//
|
|
||||||
// Initialization of standalone UBSan runtime.
|
|
||||||
//
|
|
||||||
//===----------------------------------------------------------------------===//
|
|
||||||
|
|
||||||
#include "ubsan_platform.h"
|
|
||||||
#if !CAN_SANITIZE_UB
|
|
||||||
#error "UBSan is not supported on this platform!"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "sanitizer_common/sanitizer_internal_defs.h"
|
|
||||||
#include "ubsan_init.h"
|
|
||||||
#include "ubsan_signals_standalone.h"
|
|
||||||
|
|
||||||
#if SANITIZER_CAN_USE_PREINIT_ARRAY
|
|
||||||
|
|
||||||
namespace __ubsan {
|
|
||||||
|
|
||||||
static void PreInitAsStandalone() {
|
|
||||||
InitAsStandalone();
|
|
||||||
InitializeDeadlySignals();
|
|
||||||
}
|
|
||||||
|
|
||||||
} // namespace __ubsan
|
|
||||||
|
|
||||||
__attribute__((section(".preinit_array"), used)) void (*__local_ubsan_preinit)(
|
|
||||||
void) = __ubsan::PreInitAsStandalone;
|
|
||||||
#endif // SANITIZER_CAN_USE_PREINIT_ARRAY
|
|
Loading…
Reference in New Issue