Add common interceptors for memchr/memrchr

llvm-svn: 202972
This commit is contained in:
Alexey Samsonov 2014-03-05 13:25:32 +00:00
parent 65f0a4a1af
commit 6dece3c99f
4 changed files with 64 additions and 16 deletions

View File

@ -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>();

View File

@ -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; \

View File

@ -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

View File

@ -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);