mirror of
https://github.com/Zenithsiz/ftmemsim-valgrind.git
synced 2026-02-03 18:13:01 +00:00
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:
parent
8a00ed8174
commit
a9bbc3690b
@ -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. */
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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
|
||||
|
||||
/*--------------------------------------------------------------------*/
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user