From a9bbc3690b51cc9e633f7d88d0e05fcdf2a988f3 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Wed, 18 Jan 2006 04:23:10 +0000 Subject: [PATCH] Fix an all-platforms bug introduced by the recent overhaul of function interception and wrapping. This was causing failures matching function names in suppressions to function names in backtraces when the latter names were Z-encoded (eg malloc), which typically caused all leak suppressions to fail because they contain names such as malloc, which are Z-encoded. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@5548 --- coregrind/m_debuginfo/symtab.c | 26 ++++++++++++++++++++++++++ coregrind/m_errormgr.c | 8 ++++++-- coregrind/pub_core_debuginfo.h | 6 ++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/coregrind/m_debuginfo/symtab.c b/coregrind/m_debuginfo/symtab.c index 00d15c70a1..d6ae7cfd9b 100644 --- a/coregrind/m_debuginfo/symtab.c +++ b/coregrind/m_debuginfo/symtab.c @@ -2556,6 +2556,32 @@ Bool VG_(get_fnname_nodemangle) ( Addr a, Char* buf, Int nbuf ) /*show offset?*/False ); } +/* This is only available to core... don't demangle C++ names, but do + do Z-demangling, match anywhere in function, and don't show + offsets. */ +Bool VG_(get_fnname_Z_demangle_only) ( Addr a, Char* buf, Int nbuf ) +{ +# define N_TMPBUF 4096 /* arbitrary, 4096 == ERRTXT_LEN */ + Char tmpbuf[N_TMPBUF]; + Bool ok; + vg_assert(nbuf > 0); + ok = get_fnname ( /*demangle*/False, a, tmpbuf, N_TMPBUF, + /*match_anywhere_in_fun*/True, + /*show offset?*/False ); + tmpbuf[N_TMPBUF-1] = 0; /* paranoia */ + if (!ok) + return False; + /* We have something, at least. Try to Z-demangle it. */ + ok = VG_(maybe_Z_demangle)(tmpbuf, NULL, 0, buf, nbuf, NULL); + if (!ok) { + /* Didn't Z-demangle, so just return whatever we have. */ + VG_(strncpy)(buf, tmpbuf, nbuf); + } + buf[nbuf-1] = 0; /* paranoia */ + return True; +# undef N_TMPBUF +} + /* Map a code address to the name of a shared object file or the executable. Returns False if no idea; otherwise True. Doesn't require debug info. Caller supplies buf and nbuf. */ diff --git a/coregrind/m_errormgr.c b/coregrind/m_errormgr.c index 62074ca225..6dc3bb83b3 100644 --- a/coregrind/m_errormgr.c +++ b/coregrind/m_errormgr.c @@ -1110,8 +1110,12 @@ Bool supp_matches_callers(Error* err, Supp* su) break; case FunName: - // Nb: mangled names used in suppressions - if (!VG_(get_fnname_nodemangle)(a, caller_name, ERRTXT_LEN)) + // Nb: mangled names used in suppressions. Do, though, + // Z-demangle them, since otherwise it's possible to wind + // up comparing "malloc" in the suppression against + // "_vgrZU_libcZdsoZa_malloc" in the backtrace, and the + // two of them need to be made to match. + if (!VG_(get_fnname_Z_demangle_only)(a, caller_name, ERRTXT_LEN)) VG_(strcpy)(caller_name, "???"); break; default: VG_(tool_panic)("supp_matches_callers"); diff --git a/coregrind/pub_core_debuginfo.h b/coregrind/pub_core_debuginfo.h index 32699f3989..887aba00c3 100644 --- a/coregrind/pub_core_debuginfo.h +++ b/coregrind/pub_core_debuginfo.h @@ -69,6 +69,12 @@ extern Bool VG_(use_CFI_info) ( /*MOD*/Addr* ipP, guest_code_addr. Returns 0 if not known. */ extern Addr VG_(get_tocptr) ( Addr guest_code_addr ); +/* This is only available to core... don't demangle C++ names, but do + do Z-demangling, match anywhere in function, and don't show + offsets. */ +extern +Bool VG_(get_fnname_Z_demangle_only) ( Addr a, Char* buf, Int nbuf ); + #endif // __PUB_CORE_DEBUGINFO_H /*--------------------------------------------------------------------*/ -- 2.47.2