From 144cc5daaaa2cea600098ca838778906cc661a91 Mon Sep 17 00:00:00 2001 From: Alexey Samsonov Date: Tue, 28 Apr 2015 00:56:48 +0000 Subject: Allow UBSan+MSan and UBSan+TSan combinations (Clang part). Embed UBSan runtime into TSan and MSan runtimes in the same as we do in ASan. Extend UBSan test suite to also run tests for these combinations. git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@235954 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/msan/CMakeLists.txt | 2 ++ lib/msan/msan.cc | 32 +++++++++++++++++++++++++++----- lib/msan/msan.h | 5 +++++ 3 files changed, 34 insertions(+), 5 deletions(-) (limited to 'lib/msan') diff --git a/lib/msan/CMakeLists.txt b/lib/msan/CMakeLists.txt index 596d040a5..de5980e56 100644 --- a/lib/msan/CMakeLists.txt +++ b/lib/msan/CMakeLists.txt @@ -32,9 +32,11 @@ foreach(arch ${MSAN_SUPPORTED_ARCH}) $ $ $ + $ CFLAGS ${MSAN_RTL_CFLAGS}) add_compiler_rt_runtime(clang_rt.msan_cxx-${arch} ${arch} STATIC SOURCES ${MSAN_RTL_CXX_SOURCES} + $ CFLAGS ${MSAN_RTL_CFLAGS}) add_dependencies(msan clang_rt.msan-${arch} clang_rt.msan_cxx-${arch}) diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index 87a909755..8f741de11 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -26,6 +26,8 @@ #include "sanitizer_common/sanitizer_stacktrace.h" #include "sanitizer_common/sanitizer_symbolizer.h" #include "sanitizer_common/sanitizer_stackdepot.h" +#include "ubsan/ubsan_flags.h" +#include "ubsan/ubsan_init.h" // ACHTUNG! No system header includes in this file. @@ -133,11 +135,6 @@ static void RegisterMsanFlags(FlagParser *parser, Flags *f) { } static void InitializeFlags() { - Flags *f = flags(); - FlagParser parser; - RegisterMsanFlags(&parser, f); - RegisterCommonFlags(&parser); - SetCommonFlagsDefaults(); { CommonFlags cf; @@ -151,14 +148,35 @@ static void InitializeFlags() { OverrideCommonFlags(cf); } + Flags *f = flags(); f->SetDefaults(); + FlagParser parser; + RegisterMsanFlags(&parser, f); + RegisterCommonFlags(&parser); + +#if MSAN_CONTAINS_UBSAN + __ubsan::Flags *uf = __ubsan::flags(); + uf->SetDefaults(); + + FlagParser ubsan_parser; + __ubsan::RegisterUbsanFlags(&ubsan_parser, uf); + RegisterCommonFlags(&ubsan_parser); +#endif + // Override from user-specified string. if (__msan_default_options) parser.ParseString(__msan_default_options()); +#if MSAN_CONTAINS_UBSAN + const char *ubsan_default_options = __ubsan::MaybeCallUbsanDefaultOptions(); + ubsan_parser.ParseString(ubsan_default_options); +#endif const char *msan_options = GetEnv("MSAN_OPTIONS"); parser.ParseString(msan_options); +#if MSAN_CONTAINS_UBSAN + ubsan_parser.ParseString(GetEnv("UBSAN_OPTIONS")); +#endif VPrintf(1, "MSAN_OPTIONS: %s\n", msan_options ? msan_options : ""); SetVerbosity(common_flags()->verbosity); @@ -392,6 +410,10 @@ void __msan_init() { SetCurrentThread(main_thread); main_thread->ThreadStart(); +#if MSAN_CONTAINS_UBSAN + __ubsan::InitAsPlugin(); +#endif + VPrintf(1, "MemorySanitizer init done\n"); msan_init_is_running = 0; diff --git a/lib/msan/msan.h b/lib/msan/msan.h index f5f87dd0a..2d48e69d7 100644 --- a/lib/msan/msan.h +++ b/lib/msan/msan.h @@ -20,11 +20,16 @@ #include "sanitizer_common/sanitizer_stacktrace.h" #include "msan_interface_internal.h" #include "msan_flags.h" +#include "ubsan/ubsan_platform.h" #ifndef MSAN_REPLACE_OPERATORS_NEW_AND_DELETE # define MSAN_REPLACE_OPERATORS_NEW_AND_DELETE 1 #endif +#ifndef MSAN_CONTAINS_UBSAN +# define MSAN_CONTAINS_UBSAN CAN_SANITIZE_UB +#endif + struct MappingDesc { uptr start; uptr end; -- cgit v1.2.3