diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-06-04 13:08:36 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2013-06-04 13:08:36 +0000 |
commit | 53c8c13bf138dc948743d88992f258cbb7887acf (patch) | |
tree | 88203d03e32e25303ba8c7d67465155ad18b798e | |
parent | 8f5138a23fca4398369df606877067c7aa4ef01b (diff) | |
download | bcm5719-llvm-53c8c13bf138dc948743d88992f258cbb7887acf.tar.gz bcm5719-llvm-53c8c13bf138dc948743d88992f258cbb7887acf.zip |
[msan] Implement __sanitizer_unaligned_*.
llvm-svn: 183221
-rw-r--r-- | compiler-rt/lib/msan/msan.cc | 25 | ||||
-rw-r--r-- | compiler-rt/lib/msan/msan_interface_internal.h | 20 | ||||
-rw-r--r-- | compiler-rt/lib/msan/tests/msan_test.cc | 77 |
3 files changed, 121 insertions, 1 deletions
diff --git a/compiler-rt/lib/msan/msan.cc b/compiler-rt/lib/msan/msan.cc index 667090a4cff..95b9110b7b0 100644 --- a/compiler-rt/lib/msan/msan.cc +++ b/compiler-rt/lib/msan/msan.cc @@ -459,6 +459,31 @@ u32 __msan_get_umr_origin() { return __msan_origin_tls; } +u16 __sanitizer_unaligned_load16(const void *p) { + __msan_retval_tls[0] = *(u16 *)MEM_TO_SHADOW((uptr)p); + return *(u16 *)p; +} +u32 __sanitizer_unaligned_load32(const void *p) { + __msan_retval_tls[0] = *(u32 *)MEM_TO_SHADOW((uptr)p); + return *(u32 *)p; +} +u64 __sanitizer_unaligned_load64(const void *p) { + __msan_retval_tls[0] = *(u64 *)MEM_TO_SHADOW((uptr)p); + return *(u64 *)p; +} +void __sanitizer_unaligned_store16(void *p, u16 x) { + *(u16 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; + *(u16 *)p = x; +} +void __sanitizer_unaligned_store32(void *p, u32 x) { + *(u32 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; + *(u32 *)p = x; +} +void __sanitizer_unaligned_store64(void *p, u64 x) { + *(u64 *)MEM_TO_SHADOW((uptr)p) = __msan_param_tls[1]; + *(u64 *)p = x; +} + #if !SANITIZER_SUPPORTS_WEAK_HOOKS extern "C" { SANITIZER_WEAK_ATTRIBUTE SANITIZER_INTERFACE_ATTRIBUTE diff --git a/compiler-rt/lib/msan/msan_interface_internal.h b/compiler-rt/lib/msan/msan_interface_internal.h index fb57f67c42e..0dcb926cb0f 100644 --- a/compiler-rt/lib/msan/msan_interface_internal.h +++ b/compiler-rt/lib/msan/msan_interface_internal.h @@ -120,9 +120,27 @@ void __msan_partial_poison(const void* data, void* shadow, uptr size); // Memory will be marked uninitialized, with origin at the call site. SANITIZER_INTERFACE_ATTRIBUTE void __msan_allocated_memory(const void* data, uptr size); -} // extern "C" // Unpoison first n function arguments. void __msan_unpoison_param(uptr n); +SANITIZER_INTERFACE_ATTRIBUTE +u16 __sanitizer_unaligned_load16(const void *p); + +SANITIZER_INTERFACE_ATTRIBUTE +u32 __sanitizer_unaligned_load32(const void *p); + +SANITIZER_INTERFACE_ATTRIBUTE +u64 __sanitizer_unaligned_load64(const void *p); + +SANITIZER_INTERFACE_ATTRIBUTE +void __sanitizer_unaligned_store16(void *p, u16 x); + +SANITIZER_INTERFACE_ATTRIBUTE +void __sanitizer_unaligned_store32(void *p, u32 x); + +SANITIZER_INTERFACE_ATTRIBUTE +void __sanitizer_unaligned_store64(void *p, u64 x); +} // extern "C" + #endif // MSAN_INTERFACE_INTERNAL_H diff --git a/compiler-rt/lib/msan/tests/msan_test.cc b/compiler-rt/lib/msan/tests/msan_test.cc index aee53841cdd..302881296af 100644 --- a/compiler-rt/lib/msan/tests/msan_test.cc +++ b/compiler-rt/lib/msan/tests/msan_test.cc @@ -2060,6 +2060,83 @@ TEST(MemorySanitizer, VolatileBitfield) { EXPECT_POISONED((unsigned)S->y); } +TEST(MemorySanitizer, UnalignedLoad) { + char x[32]; + memset(x + 8, 0, 16); + EXPECT_POISONED(__sanitizer_unaligned_load16(x+6)); + EXPECT_POISONED(__sanitizer_unaligned_load16(x+7)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+8)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+9)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load16(x+22)); + EXPECT_POISONED(__sanitizer_unaligned_load16(x+23)); + EXPECT_POISONED(__sanitizer_unaligned_load16(x+24)); + + EXPECT_POISONED(__sanitizer_unaligned_load32(x+4)); + EXPECT_POISONED(__sanitizer_unaligned_load32(x+7)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+8)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+9)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load32(x+20)); + EXPECT_POISONED(__sanitizer_unaligned_load32(x+21)); + EXPECT_POISONED(__sanitizer_unaligned_load32(x+24)); + + EXPECT_POISONED(__sanitizer_unaligned_load64(x)); + EXPECT_POISONED(__sanitizer_unaligned_load64(x+1)); + EXPECT_POISONED(__sanitizer_unaligned_load64(x+7)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+8)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+9)); + EXPECT_NOT_POISONED(__sanitizer_unaligned_load64(x+16)); + EXPECT_POISONED(__sanitizer_unaligned_load64(x+17)); + EXPECT_POISONED(__sanitizer_unaligned_load64(x+21)); + EXPECT_POISONED(__sanitizer_unaligned_load64(x+24)); +} + +TEST(MemorySanitizer, UnalignedStore16) { + char x[5]; + U2 y = 0; + __msan_poison(&y, 1); + __sanitizer_unaligned_store16(x + 1, y); + EXPECT_POISONED(x[0]); + EXPECT_POISONED(x[1]); + EXPECT_NOT_POISONED(x[2]); + EXPECT_POISONED(x[3]); + EXPECT_POISONED(x[4]); +} + +TEST(MemorySanitizer, UnalignedStore32) { + char x[8]; + U4 y4 = 0; + __msan_poison(&y4, 2); + __sanitizer_unaligned_store32(x+3, y4); + EXPECT_POISONED(x[0]); + EXPECT_POISONED(x[1]); + EXPECT_POISONED(x[2]); + EXPECT_POISONED(x[3]); + EXPECT_POISONED(x[4]); + EXPECT_NOT_POISONED(x[5]); + EXPECT_NOT_POISONED(x[6]); + EXPECT_POISONED(x[7]); +} + +TEST(MemorySanitizer, UnalignedStore64) { + char x[16]; + U8 y = 0; + __msan_poison(&y, 3); + __msan_poison(((char *)&y) + sizeof(y) - 2, 1); + __sanitizer_unaligned_store64(x+3, y); + EXPECT_POISONED(x[0]); + EXPECT_POISONED(x[1]); + EXPECT_POISONED(x[2]); + EXPECT_POISONED(x[3]); + EXPECT_POISONED(x[4]); + EXPECT_POISONED(x[5]); + EXPECT_NOT_POISONED(x[6]); + EXPECT_NOT_POISONED(x[7]); + EXPECT_NOT_POISONED(x[8]); + EXPECT_POISONED(x[9]); + EXPECT_NOT_POISONED(x[10]); + EXPECT_POISONED(x[11]); +} + TEST(MemorySanitizerDr, StoreInDSOTest) { if (!__msan_has_dynamic_component()) return; char* s = new char[10]; |