diff options
author | Alexey Samsonov <samsonov@google.com> | 2012-12-26 14:44:46 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2012-12-26 14:44:46 +0000 |
commit | d66b12b7012392e4725d33956af34bba7b17a90d (patch) | |
tree | 0844b650af90b6dac6a0d9133e7aec589fa87185 | |
parent | 390cf94f88b6cf6fb1900239cb48df6b046bff3a (diff) | |
download | bcm5719-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.cc | 3 | ||||
-rw-r--r-- | compiler-rt/lib/asan/lit_tests/stack-frame-demangle.cc | 24 |
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; +} |