summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2012-12-26 14:44:46 +0000
committerAlexey Samsonov <samsonov@google.com>2012-12-26 14:44:46 +0000
commitd66b12b7012392e4725d33956af34bba7b17a90d (patch)
tree0844b650af90b6dac6a0d9133e7aec589fa87185
parent390cf94f88b6cf6fb1900239cb48df6b046bff3a (diff)
downloadbcm5719-llvm-d66b12b7012392e4725d33956af34bba7b17a90d.tar.gz
bcm5719-llvm-d66b12b7012392e4725d33956af34bba7b17a90d.zip
[ASan] Teach ASan to print demangled function name when describing stack frame
llvm-svn: 171112
-rw-r--r--compiler-rt/lib/asan/asan_report.cc3
-rw-r--r--compiler-rt/lib/asan/lit_tests/stack-frame-demangle.cc24
2 files changed, 26 insertions, 1 deletions
diff --git a/compiler-rt/lib/asan/asan_report.cc b/compiler-rt/lib/asan/asan_report.cc
index 7a2a55d75d5..37f13e02d7c 100644
--- a/compiler-rt/lib/asan/asan_report.cc
+++ b/compiler-rt/lib/asan/asan_report.cc
@@ -20,6 +20,7 @@
#include "asan_thread_registry.h"
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_report_decorator.h"
+#include "sanitizer_common/sanitizer_symbolizer.h"
namespace __asan {
@@ -247,7 +248,7 @@ bool DescribeAddressIfStack(uptr addr, uptr access_size) {
Printf("%s", d.Location());
Printf("Address %p is located at offset %zu "
"in frame <%s> of T%d's stack:\n",
- (void*)addr, offset, buf, t->tid());
+ (void*)addr, offset, Demangle(buf), t->tid());
Printf("%s", d.EndLocation());
// Report the number of stack objects.
char *p;
diff --git a/compiler-rt/lib/asan/lit_tests/stack-frame-demangle.cc b/compiler-rt/lib/asan/lit_tests/stack-frame-demangle.cc
new file mode 100644
index 00000000000..7f4d59fc583
--- /dev/null
+++ b/compiler-rt/lib/asan/lit_tests/stack-frame-demangle.cc
@@ -0,0 +1,24 @@
+// Check that ASan is able to print demangled frame name even w/o
+// symbolization.
+
+// RUN: %clangxx_asan -m64 -O0 %s -o %t && %t 2>&1 | FileCheck %s
+
+#include <string.h>
+
+namespace XXX {
+struct YYY {
+ static int ZZZ(int x) {
+ char array[10];
+ memset(array, 0, 10);
+ return array[x]; // BOOOM
+ // CHECK: {{ERROR: AddressSanitizer: stack-buffer-overflow}}
+ // CHECK: {{READ of size 1 at 0x.* thread T0}}
+ // CHECK: {{Address 0x.* is .* frame <XXX::YYY::ZZZ(.*)>}}
+ }
+};
+};
+
+int main(int argc, char **argv) {
+ int res = XXX::YYY::ZZZ(argc + 10);
+ return res;
+}
OpenPOWER on IntegriCloud