diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-10-12 23:20:24 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2015-10-12 23:20:24 +0000 |
commit | 00ba8b29dc0d744529b98b34c698da437d354a6c (patch) | |
tree | f1ea0311f9858661c41118053fc3b80ada122438 | |
parent | 83eb8a52f9e739adfde4d248b5a985f37cc2325b (diff) | |
download | compiler-rt-00ba8b29dc0d744529b98b34c698da437d354a6c.tar.gz |
[msan] Add __msan_copy_shadow interface function.
This can be used to annotate copies of memory that are not observed by MSan.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@250124 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/sanitizer/msan_interface.h | 6 | ||||
-rw-r--r-- | lib/msan/msan_interceptors.cc | 5 | ||||
-rw-r--r-- | lib/msan/msan_interface_internal.h | 3 | ||||
-rw-r--r-- | test/msan/msan_copy_shadow.cc | 34 |
4 files changed, 48 insertions, 0 deletions
diff --git a/include/sanitizer/msan_interface.h b/include/sanitizer/msan_interface.h index 3d9bdc33d..6d6a37652 100644 --- a/include/sanitizer/msan_interface.h +++ b/include/sanitizer/msan_interface.h @@ -98,6 +98,12 @@ extern "C" { /* Deprecated. Call __sanitizer_set_death_callback instead. */ void __msan_set_death_callback(void (*callback)(void)); + /* Update shadow for the application copy of size bytes from src to dst. + Src and dst are application addresses. This function does not copy the + actual application memory, it only updates shadow and origin for such + copy. Source and destination regions can overlap. */ + void __msan_copy_shadow(const volatile void *dst, const volatile void *src, + size_t size); #ifdef __cplusplus } // extern "C" #endif diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index f363c2695..1bf196ecd 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -1011,6 +1011,11 @@ void __msan_allocated_memory(const void *data, uptr size) { } } +void __msan_copy_shadow(void *dest, const void *src, uptr n) { + GET_STORE_STACK_TRACE; + MoveShadowAndOrigin(dest, src, n, &stack); +} + void __sanitizer_dtor_callback(const void *data, uptr size) { GET_MALLOC_STACK_TRACE; if (flags()->poison_in_dtor) { diff --git a/lib/msan/msan_interface_internal.h b/lib/msan/msan_interface_internal.h index 7340a34ca..c1e02ce72 100644 --- a/lib/msan/msan_interface_internal.h +++ b/lib/msan/msan_interface_internal.h @@ -161,6 +161,9 @@ void __sanitizer_unaligned_store64(uu64 *p, u64 x); SANITIZER_INTERFACE_ATTRIBUTE void __msan_set_death_callback(void (*callback)(void)); + +SANITIZER_INTERFACE_ATTRIBUTE +void __msan_copy_shadow(void *dst, const void *src, uptr size); } // extern "C" #endif // MSAN_INTERFACE_INTERNAL_H diff --git a/test/msan/msan_copy_shadow.cc b/test/msan/msan_copy_shadow.cc new file mode 100644 index 000000000..a1c6347ff --- /dev/null +++ b/test/msan/msan_copy_shadow.cc @@ -0,0 +1,34 @@ +// Test that __msan_copy_shadow copies shadow, updates origin and does not touch +// the application memory. +// RUN: %clangxx_msan -fsanitize-memory-track-origins=0 -O0 %s -o %t && not %run %t 2>&1 +// RUN: %clangxx_msan -fsanitize-memory-track-origins=2 -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s + +#include <assert.h> +#include <string.h> +#include <sanitizer/msan_interface.h> + +int main() { + char *a = new char[4]; + char *b = new char[4]; + a[1] = 1; + a[3] = 2; + memset(b, 42, 4); + + // Test that __msan_copy_shadow does not touch the contents of b[]. + __msan_copy_shadow(b, a, 4); + __msan_unpoison(b, 4); + assert(b[0] == 42 && b[1] == 42 && b[2] == 42 && b[3] == 42); + + // Test that __msan_copy_shadow correctly updates shadow and origin of b[]. + __msan_copy_shadow(b, a, 4); + assert(__msan_test_shadow(b, 4) == 0); + assert(__msan_test_shadow(b + 1, 3) == 1); + assert(__msan_test_shadow(b + 3, 1) == -1); + __msan_check_mem_is_initialized(b, 4); + // CHECK: use-of-uninitialized-value + // CHECK: {{in main.*msan_copy_shadow.cc:}}[[@LINE-2]] + // CHECK: Uninitialized value was stored to memory at + // CHECK: {{in main.*msan_copy_shadow.cc:}}[[@LINE-8]] + // CHECK: Uninitialized value was created by a heap allocation + // CHECK: {{in main.*msan_copy_shadow.cc:}}[[@LINE-22]] +} |