diff options
author | Alexander Potapenko <glider@google.com> | 2012-10-26 13:24:20 +0000 |
---|---|---|
committer | Alexander Potapenko <glider@google.com> | 2012-10-26 13:24:20 +0000 |
commit | 341588afadc46bf6f0dc7babd6d531209aba5202 (patch) | |
tree | 79814be02a0cb28b9aacdcd17820c20ae8551103 | |
parent | f70848decb000cc0e4c05a27eed78865d2f38555 (diff) | |
download | compiler-rt-341588afadc46bf6f0dc7babd6d531209aba5202.tar.gz |
Fix the internal_memmove() implementation that used to skip src[0] if dst < src.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@166774 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/sanitizer_common/sanitizer_libc.cc | 5 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/sanitizer_common/tests/sanitizer_libc_test.cc | 22 |
3 files changed, 26 insertions, 2 deletions
diff --git a/lib/sanitizer_common/sanitizer_libc.cc b/lib/sanitizer_common/sanitizer_libc.cc index cb36d2cb3..537c30b82 100644 --- a/lib/sanitizer_common/sanitizer_libc.cc +++ b/lib/sanitizer_common/sanitizer_libc.cc @@ -47,13 +47,14 @@ void *internal_memcpy(void *dest, const void *src, uptr n) { void *internal_memmove(void *dest, const void *src, uptr n) { char *d = (char*)dest; char *s = (char*)src; - uptr i; + sptr i = (sptr)n; + CHECK_GE(i, 0); if (d < s) { for (i = 0; i < n; ++i) d[i] = s[i]; } else { if (d > s && n > 0) - for (i = n - 1; i > 0 ; --i) { + for (i = n - 1; i >= 0 ; --i) { d[i] = s[i]; } } diff --git a/lib/sanitizer_common/tests/CMakeLists.txt b/lib/sanitizer_common/tests/CMakeLists.txt index a4c4707af..d4debc994 100644 --- a/lib/sanitizer_common/tests/CMakeLists.txt +++ b/lib/sanitizer_common/tests/CMakeLists.txt @@ -2,6 +2,7 @@ set(SANITIZER_UNITTESTS sanitizer_allocator_test.cc sanitizer_common_test.cc sanitizer_flags_test.cc + sanitizer_libc_test.cc sanitizer_list_test.cc sanitizer_stackdepot_test.cc sanitizer_test_main.cc diff --git a/lib/sanitizer_common/tests/sanitizer_libc_test.cc b/lib/sanitizer_common/tests/sanitizer_libc_test.cc new file mode 100644 index 000000000..ff38e16ae --- /dev/null +++ b/lib/sanitizer_common/tests/sanitizer_libc_test.cc @@ -0,0 +1,22 @@ +//===-- sanitizer_libc_test.cc --------------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// Tests for sanitizer_libc.h. +//===----------------------------------------------------------------------===// + +#include "sanitizer_common/sanitizer_libc.h" +#include "gtest/gtest.h" + +// A regression test for internal_memmove() implementation. +TEST(SanitizerCommon, InternalMemmoveRegression) { + char src[] = "Hello World"; + char *dest = src + 6; + __sanitizer::internal_memmove(dest, src, 5); + EXPECT_EQ(dest[0], src[0]); + EXPECT_EQ(dest[4], src[4]); +} |