diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-07-02 14:49:24 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-07-02 14:49:24 +0000 |
commit | aa23bd83e5dc4612adfa4359737d9bbe8a243c34 (patch) | |
tree | ffcc70e94d88e4471fd7bc7165175644f3042035 | |
parent | e4cc98686af16d2126dc06f6cb6cafd13e89e675 (diff) | |
download | bcm5719-llvm-aa23bd83e5dc4612adfa4359737d9bbe8a243c34.tar.gz bcm5719-llvm-aa23bd83e5dc4612adfa4359737d9bbe8a243c34.zip |
[msan] Intercept mempcpy, wmempcpy.
llvm-svn: 185431
-rw-r--r-- | compiler-rt/lib/msan/msan_interceptors.cc | 13 | ||||
-rw-r--r-- | compiler-rt/lib/msan/tests/msan_test.cc | 7 |
2 files changed, 20 insertions, 0 deletions
diff --git a/compiler-rt/lib/msan/msan_interceptors.cc b/compiler-rt/lib/msan/msan_interceptors.cc index 720c63579b3..854e82653e0 100644 --- a/compiler-rt/lib/msan/msan_interceptors.cc +++ b/compiler-rt/lib/msan/msan_interceptors.cc @@ -107,6 +107,10 @@ INTERCEPTOR(void *, memcpy, void *dest, const void *src, SIZE_T n) { return __msan_memcpy(dest, src, n); } +INTERCEPTOR(void *, mempcpy, void *dest, const void *src, SIZE_T n) { + return (char *)__msan_memcpy(dest, src, n) + n; +} + INTERCEPTOR(void *, memmove, void *dest, const void *src, SIZE_T n) { return __msan_memmove(dest, src, n); } @@ -449,6 +453,13 @@ INTERCEPTOR(wchar_t *, wmemcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { return res; } +INTERCEPTOR(wchar_t *, wmempcpy, wchar_t *dest, const wchar_t *src, SIZE_T n) { + ENSURE_MSAN_INITED(); + wchar_t *res = REAL(wmempcpy)(dest, src, n); + __msan_copy_poison(dest, src, n * sizeof(wchar_t)); + return res; +} + INTERCEPTOR(wchar_t *, wmemset, wchar_t *s, wchar_t c, SIZE_T n) { CHECK(MEM_IS_APP(s)); ENSURE_MSAN_INITED(); @@ -1143,10 +1154,12 @@ void InitializeInterceptors() { INTERCEPT_FUNCTION(fread_unlocked); INTERCEPT_FUNCTION(readlink); INTERCEPT_FUNCTION(memcpy); + INTERCEPT_FUNCTION(mempcpy); INTERCEPT_FUNCTION(memset); INTERCEPT_FUNCTION(memmove); INTERCEPT_FUNCTION(wmemset); INTERCEPT_FUNCTION(wmemcpy); + INTERCEPT_FUNCTION(wmempcpy); INTERCEPT_FUNCTION(wmemmove); INTERCEPT_FUNCTION(strcpy); // NOLINT INTERCEPT_FUNCTION(stpcpy); // NOLINT diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index dd869f8e1b8..a6095d118aa 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -2485,6 +2485,7 @@ void MemCpyTest() { T *x = new T[N]; T *y = new T[N]; T *z = new T[N]; + T *q = new T[N]; __msan_poison(x, N * sizeof(T)); __msan_set_origin(x, N * sizeof(T), ox); __msan_set_origin(y, N * sizeof(T), 777777); @@ -2495,6 +2496,12 @@ void MemCpyTest() { EXPECT_POISONED_O(y[N/2], ox); EXPECT_POISONED_O(y[N-1], ox); EXPECT_NOT_POISONED(x); + void *res = mempcpy(q, x, N * sizeof(T)); + ASSERT_EQ(q + N, res); + EXPECT_POISONED_O(q[0], ox); + EXPECT_POISONED_O(q[N/2], ox); + EXPECT_POISONED_O(q[N-1], ox); + EXPECT_NOT_POISONED(x); memmove(z, x, N * sizeof(T)); EXPECT_POISONED_O(z[0], ox); EXPECT_POISONED_O(z[N/2], ox); |