]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Bug 445235 - Java/Ada/D demangling is probably broken
authorPaul Floyd <pjfloyd@wanadoo.fr>
Sat, 12 Oct 2024 14:03:22 +0000 (16:03 +0200)
committerPaul Floyd <pjfloyd@wanadoo.fr>
Sat, 12 Oct 2024 20:22:51 +0000 (22:22 +0200)
Ada demangling is now functional.

There maybe some missing functionality like the _GLOBAL_
mentioned in the bugzilla item.

.gitignore
NEWS
coregrind/m_demangle/demangle.c
coregrind/m_redir.c
coregrind/pub_core_demangle.h
memcheck/tests/Makefile.am
memcheck/tests/bug445235_ada_demangle.c [new file with mode: 0644]
memcheck/tests/bug445235_ada_demangle.stderr.exp [new file with mode: 0644]
memcheck/tests/bug445235_ada_demangle.vgtest [new file with mode: 0644]

index 6d650febab4ea7132e127dcd8e9b9f9e341e13a3..8275e9f901994166ff646e539a03c8dfb86c65a3 100644 (file)
 /memcheck/tests/bug287260
 /memcheck/tests/bug340392
 /memcheck/tests/bug401284
+/memcheck/tests/bug445235_ada_demangle
 /memcheck/tests/bug464969_d_demangle
 /memcheck/tests/bug472219
 /memcheck/tests/bug484002
diff --git a/NEWS b/NEWS
index a0b02faf31411d99abeb9e5968d8f56099a1a74a..b375fa2687ce93259ce7f1a036350c660964ce6d 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ AMD64/macOS 10.13 and nanoMIPS/Linux.
   option are deprecated and will be removed in a future valgrind
   version.
 
+* Ada name demangling is now supported in error messages.
+
 * ================== PLATFORM CHANGES =================
 
 * S390X added support for the DFLTCC instruction provided by the
@@ -51,6 +53,7 @@ are not entered into bugzilla tend to get forgotten about or ignored.
 440180  s390x: Failed assertion in disassembler
 444781  MIPS: wrong syscall numbers used
 447989  Support Armv8.2 SHA-512 instructions
+445235  Java/Ada/D demangling is probably broken
 453044  gbserver_tests failures in aarch64
 479661  Valgrind leaks file descriptors
 486180  [Valgrind][MIPS] 'VexGuestArchState' has no member named
index a4031dc8ac5f9619caae8d9d7e3d89d766778d7b..ca066a4b079667451013efc440fc3c95ab601c20 100644 (file)
@@ -1,6 +1,6 @@
 
 /*--------------------------------------------------------------------*/
-/*--- Demangling of C++ mangled names.                  demangle.c ---*/
+/*--- Demangling of decorated names.                    demangle.c ---*/
 /*--------------------------------------------------------------------*/
 
 /*
@@ -41,6 +41,7 @@
 #include "vg_libciface.h"
 #include "demangle.h"
 
+Bool VG_(lang_is_ada) = False;
 
 /*------------------------------------------------------------*/
 /*---                                                      ---*/
@@ -125,8 +126,8 @@ void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
    // XXX: the Java/Rust/Ada demangling here probably doesn't work. See
    // https://bugs.kde.org/show_bug.cgi?id=445235 for details.
    if (do_cxx_demangling && VG_(clo_demangle)
-       && orig != NULL && orig[0] == '_'
-       && (orig[1] == 'Z' || orig[1] == 'R' || orig[1] == 'D')) {
+       && orig != NULL && (VG_(lang_is_ada) ||
+      (orig[0] == '_' && (orig[1] == 'Z' || orig[1] == 'R' || orig[1] == 'D')))) {
       /* !!! vvv STATIC vvv !!! */
       static HChar* demangled = NULL;
       /* !!! ^^^ STATIC ^^^ !!! */
@@ -138,6 +139,8 @@ void VG_(demangle) ( Bool do_cxx_demangling, Bool do_z_demangling,
       }
       if (orig[1] == 'D') {
         demangled = dlang_demangle ( orig, DMGL_ANSI | DMGL_PARAMS );
+      } else if (VG_(lang_is_ada)) {
+         demangled = ada_demangle(orig, 0);
       } else {
         demangled = ML_(cplus_demangle) ( orig, DMGL_ANSI | DMGL_PARAMS );
       }
index f50624c2ba99fa8df2b821dd7cb2ce7bd84fab27..f9e8d8801a192e894ae901a30ba525ab490f5ee6 100644 (file)
@@ -533,6 +533,14 @@ void VG_(redir_notify_new_DebugInfo)( DebugInfo* newdi )
          alloc_symname_array(sym_name_pri, sym_names_sec, &twoslots[0]);
       const HChar** names;
       for (names = names_init; *names; names++) {
+         /*
+          * For Ada demangling, the language doesn't use a regular
+          * prefix like _Z or _R, so look for a common symbol and
+          * set a global flag.
+          */
+         if (!isText && VG_(strcmp)(*names, "__gnat_ada_main_program_name") == 0) {
+            VG_(lang_is_ada) = True;
+         }
          isGlobal = False;
          ok = VG_(maybe_Z_demangle)( *names,
                                      &demangled_sopatt,
index 86990831f907f092f6af1ec6f011f43b50f4b0ff..1532251b21b0f55c470356cb23242d7218a67c7f 100644 (file)
@@ -63,6 +63,12 @@ Bool VG_(maybe_Z_demangle) ( const HChar* sym,
                              /*OUT*/Int*  eclassTag,     // may be NULL
                              /*OUT*/Int*  eclassPrio );  // may be NULL
 
+/*
+ * ada doesn't use a simple prefix for its mangling like D, Rust and C++
+ * So when we see an ada-like symbol this global gets set.
+ */
+extern Bool VG_(lang_is_ada);
+
 #endif   // __PUB_CORE_DEMANGLE_H
 
 /*--------------------------------------------------------------------*/
index 19ac767303fa9829e6cb9444f5b20e480b0342f4..c3b5fdbe94435d214316a62da35421a14d9f3b35 100644 (file)
@@ -122,6 +122,7 @@ EXTRA_DIST = \
        bug155125.stderr.exp bug155125.vgtest \
        bug287260.stderr.exp bug287260.vgtest \
        bug340392.stderr.exp bug340392.vgtest \
+       bug445235_ada_demangle.stderr.exp bug445235_ada_demangle.vgtest \
        bug401284.stderr.exp bug401284.stdout.exp bug401284.vgtest \
        bug464969_d_demangle.stderr.exp bug464969_d_demangle.vgtest \
                bug464969_d_demangle.stdout.exp \
@@ -475,6 +476,7 @@ check_PROGRAMS = \
        bug287260 \
        bug340392 \
        bug401284 \
+       bug445235_ada_demangle \
        bug464969_d_demangle \
        bug472219 \
        calloc-overflow \
diff --git a/memcheck/tests/bug445235_ada_demangle.c b/memcheck/tests/bug445235_ada_demangle.c
new file mode 100644 (file)
index 0000000..798980c
--- /dev/null
@@ -0,0 +1,40 @@
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include "memcheck/memcheck.h"
+
+// this non-text symbol is required to trigger ada demangling
+const char* __gnat_ada_main_program_name = "some string";
+
+// the functions are transcribed from symbols in an
+// Ada hello world using a package
+void system__file_io__write_buf(char* m)
+{
+   if (m[4])
+   {
+      exit(-1);
+   }
+}
+
+void ada__text_io__put_line(char *m)
+{
+   system__file_io__write_buf(m);
+}
+
+void bad_print__uninit_print(char *m)
+{
+   ada__text_io__put_line(m);
+}
+
+void _ada_main(char* m)
+{
+   bad_print__uninit_print(m);
+}
+
+int main(void)
+{
+   char* HW = strdup("Hello, world!\n");
+   VALGRIND_MAKE_MEM_UNDEFINED(HW+4, 1);
+   
+   _ada_main(HW);
+}
diff --git a/memcheck/tests/bug445235_ada_demangle.stderr.exp b/memcheck/tests/bug445235_ada_demangle.stderr.exp
new file mode 100644 (file)
index 0000000..8623f72
--- /dev/null
@@ -0,0 +1,7 @@
+Conditional jump or move depends on uninitialised value(s)
+   at 0x........: system.file_io.write_buf (bug445235_ada_demangle.c:13)
+   by 0x........: ada.text_io.put_line (bug445235_ada_demangle.c:21)
+   by 0x........: bad_print.uninit_print (bug445235_ada_demangle.c:26)
+   by 0x........: main (bug445235_ada_demangle.c:31)
+   by 0x........: main (bug445235_ada_demangle.c:39)
+
diff --git a/memcheck/tests/bug445235_ada_demangle.vgtest b/memcheck/tests/bug445235_ada_demangle.vgtest
new file mode 100644 (file)
index 0000000..d8d2633
--- /dev/null
@@ -0,0 +1,2 @@
+prog: bug445235_ada_demangle
+vgopts: -q