forked from OSchip/llvm-project
Add common interceptors for memchr/memrchr
llvm-svn: 202972
This commit is contained in:
parent
65f0a4a1af
commit
6dece3c99f
|
|
@ -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>();
|
||||
|
|
|
|||
|
|
@ -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; \
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Reference in New Issue