diff options
author | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-05-07 11:50:14 +0000 |
---|---|---|
committer | Evgeniy Stepanov <eugeni.stepanov@gmail.com> | 2014-05-07 11:50:14 +0000 |
commit | 1b2f8f4efeb46346625fbd6efc1b15a950e2c773 (patch) | |
tree | 9578969a4088ffc7b77b755fe20ef9141f388fee | |
parent | fdabef2e6c710e4973afed3a294a21ada1f532c2 (diff) |
[msan] Fix __msan_check_mem_is_initialized and prettify its output.
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@208195 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/msan/msan.cc | 3 | ||||
-rw-r--r-- | lib/msan/msan.h | 2 | ||||
-rw-r--r-- | lib/msan/msan_interceptors.cc | 3 | ||||
-rw-r--r-- | lib/msan/msan_report.cc | 11 | ||||
-rw-r--r-- | test/msan/getaddrinfo-positive.cc | 2 | ||||
-rw-r--r-- | test/msan/ioctl_custom.cc | 2 | ||||
-rw-r--r-- | test/msan/msan_check_mem_is_initialized.cc | 28 |
7 files changed, 46 insertions, 5 deletions
diff --git a/lib/msan/msan.cc b/lib/msan/msan.cc index 1df4fb8df..cb3498ef8 100644 --- a/lib/msan/msan.cc +++ b/lib/msan/msan.cc @@ -411,12 +411,13 @@ sptr __msan_test_shadow(const void *x, uptr size) { void __msan_check_mem_is_initialized(const void *x, uptr size) { if (!__msan::flags()->report_umrs) return; - sptr offset = __msan_test_shadow(x, size) < 0; + sptr offset = __msan_test_shadow(x, size); if (offset < 0) return; GET_CALLER_PC_BP_SP; (void)sp; + ReportUMRInsideAddressRange(__func__, x, size, offset); __msan::PrintWarningWithOrigin(pc, bp, __msan_get_origin(((char *)x) + offset)); if (__msan::flags()->halt_on_error) { diff --git a/lib/msan/msan.h b/lib/msan/msan.h index 74fd76ed0..c307534b0 100644 --- a/lib/msan/msan.h +++ b/lib/msan/msan.h @@ -84,6 +84,8 @@ void ReportUMR(StackTrace *stack, u32 origin); void ReportExpectedUMRNotFound(StackTrace *stack); void ReportAtExitStatistics(); void DescribeMemoryRange(const void *x, uptr size); +void ReportUMRInsideAddressRange(const char *what, const void *start, uptr size, + uptr offset); // Unpoison first n function arguments. void UnpoisonParam(uptr n); diff --git a/lib/msan/msan_interceptors.cc b/lib/msan/msan_interceptors.cc index 2062f7f4b..15f807ada 100644 --- a/lib/msan/msan_interceptors.cc +++ b/lib/msan/msan_interceptors.cc @@ -67,8 +67,7 @@ bool IsInInterceptorScope() { if (offset >= 0 && __msan::flags()->report_umrs) { \ GET_CALLER_PC_BP_SP; \ (void) sp; \ - Printf("UMR in %s at offset %d inside [%p, +%d) \n", __func__, \ - offset, x, n); \ + ReportUMRInsideAddressRange(__func__, x, n, offset); \ __msan::PrintWarningWithOrigin(pc, bp, \ __msan_get_origin((char *)x + offset)); \ if (__msan::flags()->halt_on_error) { \ diff --git a/lib/msan/msan_report.cc b/lib/msan/msan_report.cc index 12bac2e8c..453c81710 100644 --- a/lib/msan/msan_report.cc +++ b/lib/msan/msan_report.cc @@ -235,4 +235,15 @@ void DescribeMemoryRange(const void *x, uptr size) { } } +void ReportUMRInsideAddressRange(const char *what, const void *start, uptr size, + uptr offset) { + Decorator d; + Printf("%s", d.Warning()); + Printf("%sUninitialized bytes in %s%s%s at offset %zu inside [%p, %zu)%s\n", + d.Warning(), d.Name(), what, d.Warning(), offset, start, size, + d.End()); + if (__sanitizer::common_flags()->verbosity > 0) + DescribeMemoryRange(start, size); +} + } // namespace __msan diff --git a/test/msan/getaddrinfo-positive.cc b/test/msan/getaddrinfo-positive.cc index d169cfb01..7658cd504 100644 --- a/test/msan/getaddrinfo-positive.cc +++ b/test/msan/getaddrinfo-positive.cc @@ -16,7 +16,7 @@ int main(void) { int res = getaddrinfo("localhost", NULL, NULL, &ai); if (ai) z = 1; // OK res = getaddrinfo("localhost", NULL, &hint, &ai); - // CHECK: UMR in __interceptor_getaddrinfo at offset 0 inside + // CHECK: Uninitialized bytes in __interceptor_getaddrinfo at offset 0 inside [0x{{.*}}, 48) // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK: #0 {{.*}} in main {{.*}}getaddrinfo-positive.cc:[[@LINE-3]] return 0; diff --git a/test/msan/ioctl_custom.cc b/test/msan/ioctl_custom.cc index dea65153e..7c7fde4bd 100644 --- a/test/msan/ioctl_custom.cc +++ b/test/msan/ioctl_custom.cc @@ -23,7 +23,7 @@ int main(int argc, char **argv) { ifc.ifc_len = sizeof(ifreqs); #endif int res = ioctl(fd, SIOCGIFCONF, (void *)&ifc); - // CHECK: UMR in ioctl{{.*}} at offset 0 + // CHECK: Uninitialized bytes in ioctl{{.*}} at offset 0 inside [0x{{.*}}, 4) // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value // CHECK: #{{.*}} in main {{.*}}ioctl_custom.cc:[[@LINE-3]] assert(res == 0); diff --git a/test/msan/msan_check_mem_is_initialized.cc b/test/msan/msan_check_mem_is_initialized.cc new file mode 100644 index 000000000..33558cd2f --- /dev/null +++ b/test/msan/msan_check_mem_is_initialized.cc @@ -0,0 +1,28 @@ +// RUN: %clangxx_msan -m64 -O0 -g -DPOSITIVE %s -o %t +// RUN: not %run %t 2>&1 | FileCheck %s --check-prefix=CHECK +// RUN: MSAN_OPTIONS=verbosity=1 not %run %t 2>&1 | \ +// RUN: FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-VERBOSE + +// RUN: %clangxx_msan -m64 -O0 -g %s -o %t && %run %t + +#include <sanitizer/msan_interface.h> + +int main(void) { + char p[32] = {}; + __msan_poison(p + 10, 2); + + __msan_check_mem_is_initialized(p, 10); + __msan_check_mem_is_initialized(p + 12, 30); +#ifdef POSITIVE + __msan_check_mem_is_initialized(p + 5, 20); + // CHECK: Uninitialized bytes in __msan_check_mem_is_initialized at offset 5 inside [0x{{.*}}, 20) + // CHECK-VERBOSE: Shadow map of [0x{{.*}}, 0x{{.*}}), 20 bytes: + // CHECK-VERBOSE: 0x{{.*}}: ..000000 0000ffff 00000000 00000000 + // CHECK-VERBOSE: 0x{{.*}}: 00000000 00...... ........ ........ + + // CHECK: WARNING: MemorySanitizer: use-of-uninitialized-value + // CHECK: #0 0x{{.*}}in main{{.*}}msan_check_mem_is_initialized.cc:[[@LINE-7]] +#endif + return 0; +} + |