[compiler-rt] r317757 - ubsan: Allow programs to use setenv to configure ubsan_standalone.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Wed Nov 8 18:22:07 PST 2017


Author: pcc
Date: Wed Nov  8 18:22:07 2017
New Revision: 317757

URL: http://llvm.org/viewvc/llvm-project?rev=317757&view=rev
Log:
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

Removed:
    compiler-rt/trunk/lib/ubsan/ubsan_init_standalone_preinit.cc
Modified:
    compiler-rt/trunk/lib/ubsan/CMakeLists.txt
    compiler-rt/trunk/lib/ubsan/ubsan_flags.cc

Modified: compiler-rt/trunk/lib/ubsan/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/CMakeLists.txt?rev=317757&r1=317756&r2=317757&view=diff
==============================================================================
--- compiler-rt/trunk/lib/ubsan/CMakeLists.txt (original)
+++ compiler-rt/trunk/lib/ubsan/CMakeLists.txt Wed Nov  8 18:22:07 2017
@@ -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

Modified: compiler-rt/trunk/lib/ubsan/ubsan_flags.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_flags.cc?rev=317757&r1=317756&r2=317757&view=diff
==============================================================================
--- compiler-rt/trunk/lib/ubsan/ubsan_flags.cc (original)
+++ compiler-rt/trunk/lib/ubsan/ubsan_flags.cc Wed Nov  8 18:22:07 2017
@@ -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() {
@@ -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);
   }
 
@@ -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();
 

Removed: compiler-rt/trunk/lib/ubsan/ubsan_init_standalone_preinit.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/ubsan/ubsan_init_standalone_preinit.cc?rev=317756&view=auto
==============================================================================
--- compiler-rt/trunk/lib/ubsan/ubsan_init_standalone_preinit.cc (original)
+++ compiler-rt/trunk/lib/ubsan/ubsan_init_standalone_preinit.cc (removed)
@@ -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




More information about the llvm-commits mailing list