summaryrefslogtreecommitdiff
path: root/lib/msan/tests
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-06-24 11:50:26 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-06-24 11:50:26 +0000
commit3d551f27a4d33a82ac46070977c67d6f78067f28 (patch)
tree45ecbfaeaa1e7d7306e2adc5ecf36ab29fe3601f /lib/msan/tests
parent26729fe0a77f1f7137bf88fef94ecc52ab56961a (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.cc31
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];