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
This commit is contained in:
Julian Seward 2006-01-18 04:23:10 +00:00
parent 8a00ed8174
commit a9bbc3690b
3 changed files with 38 additions and 2 deletions

View File

@ -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. */

View File

@ -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");

View File

@ -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
/*--------------------------------------------------------------------*/