Skip to content

Commit

Permalink
ubsan: Allow programs to use setenv to configure ubsan_standalone.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
pcc committed Nov 9, 2017
1 parent e1d121d commit c6721f5
Show file tree
Hide file tree
Showing 3 changed files with 4 additions and 40 deletions.
1 change: 0 additions & 1 deletion compiler-rt/lib/ubsan/CMakeLists.txt
Expand Up @@ -151,7 +151,6 @@ else()
add_compiler_rt_runtime(clang_rt.ubsan_standalone
STATIC
ARCHS ${UBSAN_SUPPORTED_ARCH}
SOURCES ubsan_init_standalone_preinit.cc
OBJECT_LIBS RTSanitizerCommon
RTSanitizerCommonLibc
RTUbsan
Expand Down
6 changes: 4 additions & 2 deletions compiler-rt/lib/ubsan/ubsan_flags.cc
Expand Up @@ -18,6 +18,8 @@
#include "sanitizer_common/sanitizer_flags.h"
#include "sanitizer_common/sanitizer_flag_parser.h"

#include <stdlib.h>

namespace __ubsan {

const char *MaybeCallUbsanDefaultOptions() {
Expand Down Expand Up @@ -45,7 +47,7 @@ void InitializeFlags() {
CommonFlags cf;
cf.CopyFrom(*common_flags());
cf.print_summary = false;
cf.external_symbolizer_path = GetEnv("UBSAN_SYMBOLIZER_PATH");
cf.external_symbolizer_path = getenv("UBSAN_SYMBOLIZER_PATH");
OverrideCommonFlags(cf);
}

Expand All @@ -59,7 +61,7 @@ void InitializeFlags() {
// Override from user-specified string.
parser.ParseString(MaybeCallUbsanDefaultOptions());
// Override from environment variable.
parser.ParseString(GetEnv("UBSAN_OPTIONS"));
parser.ParseString(getenv("UBSAN_OPTIONS"));
InitializeCommonFlags();
if (Verbosity()) ReportUnrecognizedFlags();

Expand Down
37 changes: 0 additions & 37 deletions compiler-rt/lib/ubsan/ubsan_init_standalone_preinit.cc

This file was deleted.

0 comments on commit c6721f5

Please sign in to comment.