From aa76a0cf914fe768f0a31b525693abd541b19480 Mon Sep 17 00:00:00 2001 From: Etienne Bergeron Date: Thu, 21 Jul 2016 16:06:54 +0000 Subject: [PATCH] [compiler-rt] Fix memmove/memcpy overlap detection on windows Summary: The memcpy and memmove functions are the same on windows. The overlap detection logic is incorrect. printf-1 test: ``` stdin>:2:114: note: possible intended match here ==877412==ERROR: AddressSanitizer: memcpy-param-overlap: memory ranges [0x0000002bf2a8,0x0000002bf2ad) and [0x0000002bf2a9, 0x0000002bf2ae) overlap ``` ^ Reviewers: rnk Subscribers: llvm-commits, wang0109, kubabrecka, chrisha Differential Revision: https://reviews.llvm.org/D22610 llvm-svn: 276299 --- compiler-rt/lib/asan/asan_interceptors.cc | 7 ++++--- compiler-rt/lib/asan/tests/asan_str_test.cc | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/compiler-rt/lib/asan/asan_interceptors.cc b/compiler-rt/lib/asan/asan_interceptors.cc index 518ceeb..85d4e7c 100644 --- a/compiler-rt/lib/asan/asan_interceptors.cc +++ b/compiler-rt/lib/asan/asan_interceptors.cc @@ -725,11 +725,12 @@ void InitializeAsanInterceptors() { InitializeCommonInterceptors(); // Intercept mem* functions. - ASAN_INTERCEPT_FUNC(memcpy); ASAN_INTERCEPT_FUNC(memset); + ASAN_INTERCEPT_FUNC(memmove); 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 { + REAL(memcpy) = REAL(memmove); } CHECK(REAL(memcpy)); diff --git a/compiler-rt/lib/asan/tests/asan_str_test.cc b/compiler-rt/lib/asan/tests/asan_str_test.cc index dd75587..8173294 100644 --- a/compiler-rt/lib/asan/tests/asan_str_test.cc +++ b/compiler-rt/lib/asan/tests/asan_str_test.cc @@ -456,6 +456,7 @@ TEST(AddressSanitizer, StrArgsOverlapTest) { // memmove(). #if !defined(__APPLE__) || !defined(MAC_OS_X_VERSION_10_7) || \ (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7) +#if PLATFORM_HAS_DIFFERENT_MEMCPY_AND_MEMMOVE // Check "memcpy". Use Ident() to avoid inlining. memset(str, 'z', size); Ident(memcpy)(str + 1, str + 11, 10); @@ -463,6 +464,7 @@ TEST(AddressSanitizer, StrArgsOverlapTest) { 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. // See http://llvm.org/bugs/show_bug.cgi?id=11763. -- 2.7.4