forked from OSchip/llvm-project
[compiler-rt] Fix warnings in interception code
Summary: This patch is re-introducing the code to fix the dynamic hooking on windows and to fix a compiler warning on Apple. Related patches: * https://reviews.llvm.org/D22641 * https://reviews.llvm.org/D22610 * https://reviews.llvm.org/rL276311 * https://reviews.llvm.org/rL276490 Both architecture are using different techniques to hook on library functions (memchr, strcpy,...). On Apple, the function is not dynamically hooked and the symbol always points to a valid function (i.e. can't be null). The REAL macro returns the symbol. On windows, the function is dynamically patch and the REAL(...) function may or may not be null. It depend on whether or not the function was hooked correctly. Also, on windows memcpy and memmove are the same. ``` #if !defined(__APPLE__) [...] # define REAL(x) __interception::PTR_TO_REAL(x) # define ASSIGN_REAL(dst, src) REAL(dst) = REAL(src) [...] #else // __APPLE__ [...] # define REAL(x) x # define ASSIGN_REAL(x, y) [...] #endif // __APPLE__ Reviewers: rnk Subscribers: kcc, hans, kubabrecka, llvm-commits, bruno, chrisha Differential Revision: https://reviews.llvm.org/D22758 llvm-svn: 276885
This commit is contained in:
parent
271ca40118
commit
8c6eb1566c
|
@ -725,11 +725,13 @@ void InitializeAsanInterceptors() {
|
|||
InitializeCommonInterceptors();
|
||||
|
||||
// Intercept mem* functions.
|
||||
ASAN_INTERCEPT_FUNC(memcpy);
|
||||
ASAN_INTERCEPT_FUNC(memmove);
|
||||
ASAN_INTERCEPT_FUNC(memset);
|
||||
if (PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE) {
|
||||
// In asan, REAL(memmove) is not used, but it is used in msan.
|
||||
ASAN_INTERCEPT_FUNC(memmove);
|
||||
ASAN_INTERCEPT_FUNC(memcpy);
|
||||
} else {
|
||||
ASSIGN_REAL(memcpy, memmove);
|
||||
}
|
||||
CHECK(REAL(memcpy));
|
||||
|
||||
|
|
|
@ -457,11 +457,13 @@ TEST(AddressSanitizer, StrArgsOverlapTest) {
|
|||
#if !defined(__APPLE__) || !defined(MAC_OS_X_VERSION_10_7) || \
|
||||
(MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7)
|
||||
// Check "memcpy". Use Ident() to avoid inlining.
|
||||
#if PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE
|
||||
memset(str, 'z', size);
|
||||
Ident(memcpy)(str + 1, str + 11, 10);
|
||||
Ident(memcpy)(str, str, 0);
|
||||
EXPECT_DEATH(Ident(memcpy)(str, str + 14, 15), OverlapErrorMessage("memcpy"));
|
||||
EXPECT_DEATH(Ident(memcpy)(str + 14, str, 15), OverlapErrorMessage("memcpy"));
|
||||
#endif
|
||||
#endif
|
||||
|
||||
// We do not treat memcpy with to==from as a bug.
|
||||
|
|
|
@ -158,10 +158,12 @@ const interpose_substitution substitution_##func_name[] \
|
|||
namespace __interception { \
|
||||
extern FUNC_TYPE(func) PTR_TO_REAL(func); \
|
||||
}
|
||||
# define ASSIGN_REAL(dst, src) REAL(dst) = REAL(src)
|
||||
#else // __APPLE__
|
||||
# define REAL(x) x
|
||||
# define DECLARE_REAL(ret_type, func, ...) \
|
||||
extern "C" ret_type func(__VA_ARGS__);
|
||||
# define ASSIGN_REAL(x, y)
|
||||
#endif // __APPLE__
|
||||
|
||||
#define DECLARE_REAL_AND_INTERCEPTOR(ret_type, func, ...) \
|
||||
|
|
|
@ -663,12 +663,16 @@ INTERCEPTOR(void*, memchr, const void *s, int c, SIZE_T n) {
|
|||
return internal_memchr(s, c, n);
|
||||
void *ctx;
|
||||
COMMON_INTERCEPTOR_ENTER(ctx, memchr, s, c, n);
|
||||
#if SANITIZER_WINDOWS
|
||||
void *res;
|
||||
if (REAL(memchr)) {
|
||||
res = REAL(memchr)(s, c, n);
|
||||
} else {
|
||||
res = internal_memchr(s, c, n);
|
||||
}
|
||||
#else
|
||||
void *res = REAL(memchr)(s, c, n);
|
||||
#endif
|
||||
uptr len = res ? (char *)res - (const char *)s + 1 : n;
|
||||
COMMON_INTERCEPTOR_READ_RANGE(ctx, s, len);
|
||||
return res;
|
||||
|
|
Loading…
Reference in New Issue