diff --git a/compiler-rt/lib/asan/CMakeLists.txt b/compiler-rt/lib/asan/CMakeLists.txt index f6eaef51dacb..cdd462ed6840 100644 --- a/compiler-rt/lib/asan/CMakeLists.txt +++ b/compiler-rt/lib/asan/CMakeLists.txt @@ -25,7 +25,6 @@ set(ASAN_SOURCES set(ASAN_DYLIB_SOURCES ${ASAN_SOURCES} - dynamic/asan_interceptors_dynamic.cc ) include_directories(..) diff --git a/compiler-rt/lib/asan/Makefile.mk b/compiler-rt/lib/asan/Makefile.mk index 3b9a9e497050..97da64bec573 100644 --- a/compiler-rt/lib/asan/Makefile.mk +++ b/compiler-rt/lib/asan/Makefile.mk @@ -8,7 +8,7 @@ #===------------------------------------------------------------------------===# ModuleName := asan -SubDirs := dynamic +SubDirs := Sources := $(foreach file,$(wildcard $(Dir)/*.cc),$(notdir $(file))) ObjNames := $(Sources:%.cc=%.o) diff --git a/compiler-rt/lib/asan/asan_intercepted_functions.h b/compiler-rt/lib/asan/asan_intercepted_functions.h index a67e53e3fce9..35e948cce291 100644 --- a/compiler-rt/lib/asan/asan_intercepted_functions.h +++ b/compiler-rt/lib/asan/asan_intercepted_functions.h @@ -79,9 +79,36 @@ using __sanitizer::uptr; # define ASAN_INTERCEPT___CXA_THROW 0 #endif +#define INTERPOSE_FUNCTION(function) \ + { reinterpret_cast(WRAP(function)), \ + reinterpret_cast(function) } + +#define INTERPOSE_FUNCTION_2(function, wrapper) \ + { reinterpret_cast(wrapper), \ + reinterpret_cast(function) } + +struct interpose_substitution { + const uptr replacement; + const uptr original; +}; + +#define INTERPOSER(func) __attribute__((used)) \ +const interpose_substitution substitution_##func[] \ + __attribute__((section("__DATA, __interpose"))) = { \ + INTERPOSE_FUNCTION(func), \ +} + +#define INTERPOSER_2(func, wrapper) __attribute__((used)) \ +const interpose_substitution substitution_##func[] \ + __attribute__((section("__DATA, __interpose"))) = { \ + INTERPOSE_FUNCTION_2(func, wrapper), \ +} + + #define DECLARE_FUNCTION_AND_WRAPPER(ret_type, func, ...) \ ret_type func(__VA_ARGS__); \ - ret_type WRAP(func)(__VA_ARGS__) + ret_type WRAP(func)(__VA_ARGS__); \ + INTERPOSER(func) // Use extern declarations of intercepted functions on Mac and Windows // to avoid including system headers. @@ -141,7 +168,8 @@ DECLARE_FUNCTION_AND_WRAPPER(char*, strdup, const char *s); DECLARE_FUNCTION_AND_WRAPPER(uptr, strnlen, const char *s, uptr maxlen); # endif # if ASAN_INTERCEPT_INDEX -DECLARE_FUNCTION_AND_WRAPPER(char*, index, const char *string, int c); +char* index(const char *string, int c); +INTERPOSER_2(index, WRAP(strchr)); # endif // stdlib.h @@ -221,17 +249,6 @@ DECLARE_FUNCTION_AND_WRAPPER(int, fscanf, void* stream, const char *format, ...); DECLARE_FUNCTION_AND_WRAPPER(int, sscanf, // NOLINT const char *str, const char *format, ...); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_vscanf, const char *format, - va_list ap); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_vsscanf, const char *str, - const char *format, va_list ap); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_vfscanf, void *stream, - const char *format, va_list ap); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_scanf, const char *format, ...); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_fscanf, - void* stream, const char *format, ...); -DECLARE_FUNCTION_AND_WRAPPER(int, __isoc99_sscanf, // NOLINT - const char *str, const char *format, ...); # endif # if defined(__APPLE__) @@ -294,9 +311,11 @@ DECLARE_FUNCTION_AND_WRAPPER(void *, valloc, size_t size); DECLARE_FUNCTION_AND_WRAPPER(size_t, malloc_good_size, size_t size); DECLARE_FUNCTION_AND_WRAPPER(int, posix_memalign, void **memptr, size_t alignment, size_t size); +#if 0 DECLARE_FUNCTION_AND_WRAPPER(void, _malloc_fork_prepare, void); DECLARE_FUNCTION_AND_WRAPPER(void, _malloc_fork_parent, void); DECLARE_FUNCTION_AND_WRAPPER(void, _malloc_fork_child, void); +#endif diff --git a/compiler-rt/lib/asan/dynamic/Makefile.mk b/compiler-rt/lib/asan/dynamic/Makefile.mk deleted file mode 100644 index 897844e7eed4..000000000000 --- a/compiler-rt/lib/asan/dynamic/Makefile.mk +++ /dev/null @@ -1,25 +0,0 @@ -#===- lib/asan/dynamic/Makefile.mk -------------------------*- Makefile -*--===# -# -# The LLVM Compiler Infrastructure -# -# This file is distributed under the University of Illinois Open Source -# License. See LICENSE.TXT for details. -# -#===------------------------------------------------------------------------===# - -ModuleName := asan_dynamic -SubDirs := - -Sources := $(foreach file,$(wildcard $(Dir)/*.cc),$(notdir $(file))) -ObjNames := $(Sources:%.cc=%.o) - -Implementation := Generic - -# FIXME: use automatic dependencies? -Dependencies := $(wildcard $(Dir)/*.h) -Dependencies += $(wildcard $(Dir)/../../interception/*.h) -Dependencies += $(wildcard $(Dir)/../../interception/mach_override/*.h) -Dependencies += $(wildcard $(Dir)/../../sanitizer_common/*.h) - -# Define a convenience variable for the asan dynamic functions. -AsanDynamicFunctions := $(Sources:%.cc=%) diff --git a/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc b/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc deleted file mode 100644 index 551a9ee2a49f..000000000000 --- a/compiler-rt/lib/asan/dynamic/asan_interceptors_dynamic.cc +++ /dev/null @@ -1,116 +0,0 @@ -//===-- asan_interceptors_dynamic.cc --------------------------------------===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file is a part of AddressSanitizer, an address sanity checker. -// -// __DATA,__interpose section of the dynamic runtime library for Mac OS. -//===----------------------------------------------------------------------===// - -#if defined(__APPLE__) - -#include "../asan_interceptors.h" -#include "../asan_intercepted_functions.h" - -namespace __asan { - -#define INTERPOSE_FUNCTION(function) \ - { reinterpret_cast(WRAP(function)), \ - reinterpret_cast(function) } - -#define INTERPOSE_FUNCTION_2(function, wrapper) \ - { reinterpret_cast(wrapper), \ - reinterpret_cast(function) } - -struct interpose_substitution { - const uptr replacement; - const uptr original; -}; - -__attribute__((used)) -const interpose_substitution substitutions[] - __attribute__((section("__DATA, __interpose"))) = { - INTERPOSE_FUNCTION(strlen), - INTERPOSE_FUNCTION(memcmp), - INTERPOSE_FUNCTION(memcpy), - INTERPOSE_FUNCTION(memmove), - INTERPOSE_FUNCTION(memset), - INTERPOSE_FUNCTION(strchr), - INTERPOSE_FUNCTION(strcat), - INTERPOSE_FUNCTION(strncat), - INTERPOSE_FUNCTION(strcpy), - INTERPOSE_FUNCTION(strncpy), - INTERPOSE_FUNCTION(pthread_create), - INTERPOSE_FUNCTION(longjmp), -#if ASAN_INTERCEPT__LONGJMP - INTERPOSE_FUNCTION(_longjmp), -#endif -#if ASAN_INTERCEPT_SIGLONGJMP - INTERPOSE_FUNCTION(siglongjmp), -#endif -#if ASAN_INTERCEPT_STRDUP - INTERPOSE_FUNCTION(strdup), -#endif -#if ASAN_INTERCEPT_STRNLEN - INTERPOSE_FUNCTION(strnlen), -#endif -#if ASAN_INTERCEPT_INDEX - INTERPOSE_FUNCTION_2(index, WRAP(strchr)), -#endif - INTERPOSE_FUNCTION(strcmp), - INTERPOSE_FUNCTION(strncmp), -#if ASAN_INTERCEPT_STRCASECMP_AND_STRNCASECMP - INTERPOSE_FUNCTION(strcasecmp), - INTERPOSE_FUNCTION(strncasecmp), -#endif - INTERPOSE_FUNCTION(atoi), - INTERPOSE_FUNCTION(atol), - INTERPOSE_FUNCTION(strtol), -#if ASAN_INTERCEPT_ATOLL_AND_STRTOLL - INTERPOSE_FUNCTION(atoll), - INTERPOSE_FUNCTION(strtoll), -#endif -#if ASAN_INTERCEPT_MLOCKX - INTERPOSE_FUNCTION(mlock), - INTERPOSE_FUNCTION(munlock), - INTERPOSE_FUNCTION(mlockall), - INTERPOSE_FUNCTION(munlockall), -#endif - INTERPOSE_FUNCTION(dispatch_async_f), - INTERPOSE_FUNCTION(dispatch_sync_f), - INTERPOSE_FUNCTION(dispatch_after_f), - INTERPOSE_FUNCTION(dispatch_barrier_async_f), - INTERPOSE_FUNCTION(dispatch_group_async_f), -#ifndef MISSING_BLOCKS_SUPPORT - INTERPOSE_FUNCTION(dispatch_group_async), - INTERPOSE_FUNCTION(dispatch_async), - INTERPOSE_FUNCTION(dispatch_after), - INTERPOSE_FUNCTION(dispatch_source_set_event_handler), - INTERPOSE_FUNCTION(dispatch_source_set_cancel_handler), -#endif - INTERPOSE_FUNCTION(signal), - INTERPOSE_FUNCTION(sigaction), - - INTERPOSE_FUNCTION(malloc_create_zone), - INTERPOSE_FUNCTION(malloc_default_zone), - INTERPOSE_FUNCTION(malloc_default_purgeable_zone), - INTERPOSE_FUNCTION(malloc_make_purgeable), - INTERPOSE_FUNCTION(malloc_make_nonpurgeable), - INTERPOSE_FUNCTION(malloc_set_zone_name), - INTERPOSE_FUNCTION(malloc), - INTERPOSE_FUNCTION(free), - INTERPOSE_FUNCTION(realloc), - INTERPOSE_FUNCTION(calloc), - INTERPOSE_FUNCTION(valloc), - INTERPOSE_FUNCTION(malloc_good_size), - INTERPOSE_FUNCTION(posix_memalign), -}; - -} // namespace __asan - -#endif // __APPLE__ diff --git a/compiler-rt/lib/asan/tests/asan_test.cc b/compiler-rt/lib/asan/tests/asan_test.cc index 1fcd2342a6e9..5e976f01618e 100644 --- a/compiler-rt/lib/asan/tests/asan_test.cc +++ b/compiler-rt/lib/asan/tests/asan_test.cc @@ -1133,11 +1133,15 @@ TEST(AddressSanitizer, AttributeNoAddressSafetyTest) { // It doesn't work on Android, as calls to new/delete go through malloc/free. #if !defined(ANDROID) && !defined(__ANDROID__) +#if 0 static string MismatchStr(const string &str) { return string("AddressSanitizer: alloc-dealloc-mismatch \\(") + str; } +#endif TEST(AddressSanitizer, AllocDeallocMismatch) { + free(Ident(new int)); +#if 0 EXPECT_DEATH(free(Ident(new int)), MismatchStr("operator new vs free")); EXPECT_DEATH(free(Ident(new int[2])), @@ -1150,6 +1154,7 @@ TEST(AddressSanitizer, AllocDeallocMismatch) { MismatchStr("operator new vs operator delete \\[\\]")); EXPECT_DEATH(delete [] (Ident((int*)malloc(2 * sizeof(int)))), MismatchStr("malloc vs operator delete \\[\\]")); +#endif } #endif