forked from OSchip/llvm-project
[ASan] Delete asan/dynamic dir and temporarily move the interposers declarations to asan_intercepted_functions.h
Now that we have only one dependency on asan_intercepted_functions.h, we can unite that code with the interceptors declarations in asan_interceptors.cc and get rid of asan_intercepted_functions.h llvm-svn: 175631
This commit is contained in:
parent
0c91571d33
commit
70b01558f1
|
@ -25,7 +25,6 @@ set(ASAN_SOURCES
|
|||
|
||||
set(ASAN_DYLIB_SOURCES
|
||||
${ASAN_SOURCES}
|
||||
dynamic/asan_interceptors_dynamic.cc
|
||||
)
|
||||
|
||||
include_directories(..)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
#===------------------------------------------------------------------------===#
|
||||
|
||||
ModuleName := asan
|
||||
SubDirs := dynamic
|
||||
SubDirs :=
|
||||
|
||||
Sources := $(foreach file,$(wildcard $(Dir)/*.cc),$(notdir $(file)))
|
||||
ObjNames := $(Sources:%.cc=%.o)
|
||||
|
|
|
@ -79,9 +79,36 @@ using __sanitizer::uptr;
|
|||
# define ASAN_INTERCEPT___CXA_THROW 0
|
||||
#endif
|
||||
|
||||
#define INTERPOSE_FUNCTION(function) \
|
||||
{ reinterpret_cast<const uptr>(WRAP(function)), \
|
||||
reinterpret_cast<const uptr>(function) }
|
||||
|
||||
#define INTERPOSE_FUNCTION_2(function, wrapper) \
|
||||
{ reinterpret_cast<const uptr>(wrapper), \
|
||||
reinterpret_cast<const uptr>(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
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -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=%)
|
|
@ -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<const uptr>(WRAP(function)), \
|
||||
reinterpret_cast<const uptr>(function) }
|
||||
|
||||
#define INTERPOSE_FUNCTION_2(function, wrapper) \
|
||||
{ reinterpret_cast<const uptr>(wrapper), \
|
||||
reinterpret_cast<const uptr>(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__
|
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue