summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-07 11:50:14 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2014-05-07 11:50:14 +0000
commit1b2f8f4efeb46346625fbd6efc1b15a950e2c773 (patch)
tree9578969a4088ffc7b77b755fe20ef9141f388fee
parentfdabef2e6c710e4973afed3a294a21ada1f532c2 (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.cc3
-rw-r--r--lib/msan/msan.h2
-rw-r--r--lib/msan/msan_interceptors.cc3
-rw-r--r--lib/msan/msan_report.cc11
-rw-r--r--test/msan/getaddrinfo-positive.cc2
-rw-r--r--test/msan/ioctl_custom.cc2
-rw-r--r--test/msan/msan_check_mem_is_initialized.cc28
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;
+}
+