Demangling for DlAddrSymbolizer

On OS X, dladdr() provides mangled names only, so we need need to demangle in
DlAddrSymbolizer::SymbolizePC.

Reviewed at http://reviews.llvm.org/D8291

llvm-svn: 232910
This commit is contained in:
Kuba Brecka 2015-03-22 11:38:55 +00:00
parent b7e4a1a0b6
commit eefb2e2703
4 changed files with 38 additions and 2 deletions

View File

@ -28,6 +28,8 @@ const char *ExtractUptr(const char *str, const char *delims, uptr *result);
const char *ExtractTokenUpToDelimiter(const char *str, const char *delimiter,
char **result);
const char *DemangleCXXABI(const char *name);
// SymbolizerTool is an interface that is implemented by individual "tools"
// that can perform symbolication (external llvm-symbolizer, libbacktrace,
// Windows DbgHelp symbolizer, etc.).

View File

@ -31,7 +31,8 @@ bool DlAddrSymbolizer::SymbolizePC(uptr addr, SymbolizedStack *stack) {
Dl_info info;
int result = dladdr((const void *)addr, &info);
if (!result) return false;
stack->info.function = internal_strdup(info.dli_sname);
const char *demangled = DemangleCXXABI(info.dli_sname);
stack->info.function = internal_strdup(demangled);
return true;
}

View File

@ -39,7 +39,7 @@ namespace __cxxabiv1 {
namespace __sanitizer {
// Attempts to demangle the name via __cxa_demangle from __cxxabiv1.
static const char *DemangleCXXABI(const char *name) {
const char *DemangleCXXABI(const char *name) {
// FIXME: __cxa_demangle aggressively insists on allocating memory.
// There's not much we can do about that, short of providing our
// own demangler (libc++abi's implementation could be adapted so that

View File

@ -0,0 +1,33 @@
// In a non-forking sandbox, we fallback to dladdr(). Test that we provide
// properly demangled C++ names in that case.
// RUN: %clangxx_asan -O0 %s -o %t
// RUN: not %run %t 2>&1 | FileCheck %s
// RUN: ASAN_OPTIONS=verbosity=2 not %run sandbox-exec -p '(version 1)(allow default)(deny process-fork)' %t 2>&1 | FileCheck %s --check-prefix=CHECK --check-prefix=CHECK-DLADDR
#include <stdlib.h>
class MyClass {
public:
int my_function(int n) {
char *x = (char*)malloc(n * sizeof(char));
free(x);
return x[5];
// CHECK: {{.*ERROR: AddressSanitizer: heap-use-after-free on address}}
// CHECK: {{READ of size 1 at 0x.* thread T0}}
// CHECK-DLADDR: Using dladdr symbolizer
// CHECK-DLADDR: failed to fork external symbolizer
// CHECK: {{ #0 0x.* in MyClass::my_function\(int\)}}
// CHECK: {{freed by thread T0 here:}}
// CHECK: {{ #0 0x.* in wrap_free}}
// CHECK: {{ #1 0x.* in MyClass::my_function\(int\)}}
// CHECK: {{previously allocated by thread T0 here:}}
// CHECK: {{ #0 0x.* in wrap_malloc}}
// CHECK: {{ #1 0x.* in MyClass::my_function\(int\)}}
}
};
int main() {
MyClass o;
return o.my_function(10);
}