Index: compiler-rt/trunk/lib/asan/asan_interceptors.h =================================================================== --- compiler-rt/trunk/lib/asan/asan_interceptors.h +++ compiler-rt/trunk/lib/asan/asan_interceptors.h @@ -122,12 +122,16 @@ #if !SANITIZER_MAC #define ASAN_INTERCEPT_FUNC(name) \ do { \ - if ((!INTERCEPT_FUNCTION(name) || !REAL(name))) \ + INTERCEPT_FUNCTION(name); \ + bool same = (& (name) == & WRAP(name)); \ + if ((!same || !REAL(name))) \ VReport(1, "AddressSanitizer: failed to intercept '" #name "'\n"); \ } while (0) #define ASAN_INTERCEPT_FUNC_VER(name, ver) \ do { \ - if ((!INTERCEPT_FUNCTION_VER(name, ver) || !REAL(name))) \ + INTERCEPT_FUNCTION_VER(name, ver); \ + name##_type ptr = (::__interception::real_##name); \ + if ((!ptr || !REAL(name))) \ VReport( \ 1, "AddressSanitizer: failed to intercept '" #name "@@" #ver "'\n"); \ } while (0) Index: compiler-rt/trunk/lib/interception/interception_linux.h =================================================================== --- compiler-rt/trunk/lib/interception/interception_linux.h +++ compiler-rt/trunk/lib/interception/interception_linux.h @@ -30,16 +30,18 @@ } // namespace __interception #define INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) \ - ::__interception::GetRealFunctionAddress( \ + do { ::__interception::GetRealFunctionAddress( \ #func, (::__interception::uptr *)&__interception::PTR_TO_REAL(func), \ (::__interception::uptr) & (func), \ - (::__interception::uptr) & WRAP(func)) + (::__interception::uptr) & WRAP(func)); \ + } while (0) // TODO(yln): temporarily make macro void. // Android, Solaris and OpenBSD do not have dlvsym #if !SANITIZER_ANDROID && !SANITIZER_SOLARIS && !SANITIZER_OPENBSD #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ - (::__interception::real_##func = (func##_type)( \ - unsigned long)::__interception::GetFuncAddrVer(#func, symver)) + do { (::__interception::real_##func = (func##_type)( \ + unsigned long)::__interception::GetFuncAddrVer(#func, symver)); \ + } while (0) #else #define INTERCEPT_FUNCTION_VER_LINUX_OR_FREEBSD(func, symver) \ INTERCEPT_FUNCTION_LINUX_OR_FREEBSD(func) Index: compiler-rt/trunk/lib/msan/msan_interceptors.cc =================================================================== --- compiler-rt/trunk/lib/msan/msan_interceptors.cc +++ compiler-rt/trunk/lib/msan/msan_interceptors.cc @@ -1243,13 +1243,17 @@ #define MSAN_INTERCEPT_FUNC(name) \ do { \ - if ((!INTERCEPT_FUNCTION(name) || !REAL(name))) \ + INTERCEPT_FUNCTION(name); \ + bool same = (& (name) == & WRAP(name)); \ + if ((!same || !REAL(name))) \ VReport(1, "MemorySanitizer: failed to intercept '" #name "'\n"); \ } while (0) #define MSAN_INTERCEPT_FUNC_VER(name, ver) \ do { \ - if ((!INTERCEPT_FUNCTION_VER(name, ver) || !REAL(name))) \ + INTERCEPT_FUNCTION_VER(name, ver); \ + name##_type ptr = (::__interception::real_##name); \ + if ((!ptr || !REAL(name))) \ VReport( \ 1, "MemorySanitizer: failed to intercept '" #name "@@" #ver "'\n"); \ } while (0)