]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix an all-platforms bug introduced by the recent overhaul of function
authorJulian Seward <jseward@acm.org>
Wed, 18 Jan 2006 04:23:10 +0000 (04:23 +0000)
committerJulian Seward <jseward@acm.org>
Wed, 18 Jan 2006 04:23:10 +0000 (04:23 +0000)
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
coregrind/m_errormgr.c
coregrind/pub_core_debuginfo.h

index 00d15c70a19dd8457e2830b4dee7371128886e61..d6ae7cfd9ba37308d449c67ab3b6c5b6a0ae98aa 100644 (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. */
index 62074ca225fcafd62b09b56da95c23f9bcf545f2..6dc3bb83b3aed109255681a30efe9f0b433a0243 100644 (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");
index 32699f39891e30ca736be8d690e22736a7d2be3f..887aba00c33bb377723c6232ac4a77c206b8a8f1 100644 (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
 
 /*--------------------------------------------------------------------*/