diff options
author | Alexey Samsonov <samsonov@google.com> | 2014-03-05 13:25:32 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2014-03-05 13:25:32 +0000 |
commit | 836a8be108792f0c4fafe3092d33988ee025761b (patch) | |
tree | 61831b083b3f84de1ec786ffe3b65c09b5294e9e /lib | |
parent | 29ca372218cdfd47aaf50f81b968b442365b6afe (diff) |
Add common interceptors for memchr/memrchr
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@202972 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/msan/tests/msan_test.cc | 32 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_common_interceptors.inc | 30 | ||||
-rw-r--r-- | lib/sanitizer_common/sanitizer_platform_interceptors.h | 2 | ||||
-rw-r--r-- | lib/tsan/rtl/tsan_interceptors.cc | 16 |
4 files changed, 64 insertions, 16 deletions
diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index fb7011eab..09d24ecf5 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -2059,6 +2059,38 @@ TEST(MemorySanitizer, fcvt) { EXPECT_NOT_POISONED(b); } +TEST(MemorySanitizer, memchr) { + char x[10]; + break_optimization(x); + EXPECT_POISONED(x[0]); + x[2] = '2'; + void *res; + EXPECT_UMR(res = memchr(x, '2', 10)); + EXPECT_NOT_POISONED(res); + x[0] = '0'; + x[1] = '1'; + res = memchr(x, '2', 10); + EXPECT_EQ(&x[2], res); + EXPECT_UMR(res = memchr(x, '3', 10)); + EXPECT_NOT_POISONED(res); +} + +TEST(MemorySanitizer, memrchr) { + char x[10]; + break_optimization(x); + EXPECT_POISONED(x[0]); + x[9] = '9'; + void *res; + EXPECT_UMR(res = memrchr(x, '9', 10)); + EXPECT_NOT_POISONED(res); + x[0] = '0'; + x[1] = '1'; + res = memrchr(x, '0', 2); + EXPECT_EQ(&x[0], res); + EXPECT_UMR(res = memrchr(x, '7', 10)); + EXPECT_NOT_POISONED(res); +} + TEST(MemorySanitizer, frexp) { int x; x = *GetPoisoned<int>(); diff --git a/lib/sanitizer_common/sanitizer_common_interceptors.inc b/lib/sanitizer_common/sanitizer_common_interceptors.inc index 873edea97..b5fb1e4e5 100644 --- a/lib/sanitizer_common/sanitizer_common_interceptors.inc +++ b/lib/sanitizer_common/sanitizer_common_interceptors.inc @@ -163,6 +163,34 @@ INTERCEPTOR(int, strncasecmp, const char *s1, const char *s2, SIZE_T n) { #define INIT_STRNCASECMP #endif +#if SANITIZER_INTERCEPT_MEMCHR +INTERCEPTOR(void*, memchr, const void *s, int c, SIZE_T n) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, memchr, s, c, n); + void *res = REAL(memchr)(s, c, n); + uptr len = res ? (char*)res - (char*)s + 1 : n; + COMMON_INTERCEPTOR_READ_RANGE(ctx, s, len); + return res; +} + +#define INIT_MEMCHR COMMON_INTERCEPT_FUNCTION(memchr) +#else +#define INIT_MEMCHR +#endif + +#if SANITIZER_INTERCEPT_MEMRCHR +INTERCEPTOR(void*, memrchr, const void *s, int c, SIZE_T n) { + void *ctx; + COMMON_INTERCEPTOR_ENTER(ctx, memrchr, s, c, n); + COMMON_INTERCEPTOR_READ_RANGE(ctx, s, n); + return REAL(memrchr)(s, c, n); +} + +#define INIT_MEMRCHR COMMON_INTERCEPT_FUNCTION(memrchr) +#else +#define INIT_MEMRCHR +#endif + #if SANITIZER_INTERCEPT_FREXP INTERCEPTOR(double, frexp, double x, int *exp) { void *ctx; @@ -3362,6 +3390,8 @@ INTERCEPTOR(int, capset, void *hdrp, const void *datap) { INIT_STRNCMP; \ INIT_STRCASECMP; \ INIT_STRNCASECMP; \ + INIT_MEMCHR; \ + INIT_MEMRCHR; \ INIT_READ; \ INIT_PREAD; \ INIT_PREAD64; \ diff --git a/lib/sanitizer_common/sanitizer_platform_interceptors.h b/lib/sanitizer_common/sanitizer_platform_interceptors.h index 29f632431..72964a705 100644 --- a/lib/sanitizer_common/sanitizer_platform_interceptors.h +++ b/lib/sanitizer_common/sanitizer_platform_interceptors.h @@ -50,6 +50,8 @@ #define SANITIZER_INTERCEPT_STRCMP 1 #define SANITIZER_INTERCEPT_TEXTDOMAIN SI_LINUX_NOT_ANDROID #define SANITIZER_INTERCEPT_STRCASECMP SI_NOT_WINDOWS +#define SANITIZER_INTERCEPT_MEMCHR 1 +#define SANITIZER_INTERCEPT_MEMRCHR SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_READ SI_NOT_WINDOWS #define SANITIZER_INTERCEPT_PREAD SI_NOT_WINDOWS diff --git a/lib/tsan/rtl/tsan_interceptors.cc b/lib/tsan/rtl/tsan_interceptors.cc index 892393322..fd3215f68 100644 --- a/lib/tsan/rtl/tsan_interceptors.cc +++ b/lib/tsan/rtl/tsan_interceptors.cc @@ -632,20 +632,6 @@ TSAN_INTERCEPTOR(int, memcmp, const void *s1, const void *s2, uptr n) { return res; } -TSAN_INTERCEPTOR(void*, memchr, void *s, int c, uptr n) { - SCOPED_TSAN_INTERCEPTOR(memchr, s, c, n); - void *res = REAL(memchr)(s, c, n); - uptr len = res ? (char*)res - (char*)s + 1 : n; - MemoryAccessRange(thr, pc, (uptr)s, len, false); - return res; -} - -TSAN_INTERCEPTOR(void*, memrchr, char *s, int c, uptr n) { - SCOPED_TSAN_INTERCEPTOR(memrchr, s, c, n); - MemoryAccessRange(thr, pc, (uptr)s, n, false); - return REAL(memrchr)(s, c, n); -} - TSAN_INTERCEPTOR(void*, memmove, void *dst, void *src, uptr n) { SCOPED_TSAN_INTERCEPTOR(memmove, dst, src, n); MemoryAccessRange(thr, pc, (uptr)dst, n, true); @@ -2162,8 +2148,6 @@ void InitializeInterceptors() { TSAN_INTERCEPT(strlen); TSAN_INTERCEPT(memset); TSAN_INTERCEPT(memcpy); - TSAN_INTERCEPT(memchr); - TSAN_INTERCEPT(memrchr); TSAN_INTERCEPT(memmove); TSAN_INTERCEPT(memcmp); TSAN_INTERCEPT(strchr); |