diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-24 11:50:26 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-06-24 11:50:26 +0000 |
commit | 3d551f27a4d33a82ac46070977c67d6f78067f28 (patch) | |
tree | 45ecbfaeaa1e7d7306e2adc5ecf36ab29fe3601f /lib/msan/tests | |
parent | 26729fe0a77f1f7137bf88fef94ecc52ab56961a (diff) |
[msan] Fix origin copying.
Conditions for the first and the last origin value in range were wrong.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@211585 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/msan/tests')
-rw-r--r-- | lib/msan/tests/msan_test.cc | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/msan/tests/msan_test.cc b/lib/msan/tests/msan_test.cc index 438a74af5..53934ff13 100644 --- a/lib/msan/tests/msan_test.cc +++ b/lib/msan/tests/msan_test.cc @@ -1291,6 +1291,7 @@ TEST(MemorySanitizer, memcpy) { EXPECT_POISONED(y[1]); } +// Dst is poisoned, src is clean. void TestUnalignedMemcpy(int left, int right, bool src_is_aligned) { const int sz = 20; char *dst = (char *)malloc(sz); @@ -1320,6 +1321,36 @@ TEST(MemorySanitizer, memcpy_unaligned) { } } +// Src is poisoned, dst is clean. +void TestUnalignedPoisonedMemcpy(int left, int right, bool src_is_aligned) { + const int sz = 20; + char *dst = (char *)malloc(sz); + memset(dst, 0, sz); + + char *src = (char *)malloc(sz); + U4 origin = __msan_get_origin(src); + + memcpy(dst + left, src_is_aligned ? src + left : src, sz - left - right); + for (int i = 0; i < left; ++i) + EXPECT_NOT_POISONED(dst[i]); + for (int i = 0; i < right; ++i) + EXPECT_NOT_POISONED(dst[sz - i - 1]); + EXPECT_POISONED_O(dst[left], origin); + EXPECT_POISONED_O(dst[sz - right - 1], origin); + + free(dst); + free(src); +} + +TEST(MemorySanitizer, memcpy_unaligned_poisoned) { + for (int i = 0; i < 10; ++i) { + for (int j = 0; j < 10; ++j) { + TestUnalignedPoisonedMemcpy(i, j, true); + TestUnalignedPoisonedMemcpy(i, j, false); + } + } +} + TEST(MemorySanitizer, memmove) { char* x = new char[2]; char* y = new char[2]; |