From: Paul Floyd Date: Sat, 12 Oct 2024 14:03:22 +0000 (+0200) Subject: Bug 445235 - Java/Ada/D demangling is probably broken X-Git-Tag: VALGRIND_3_24_0~29 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=27fe47bd8a6d803966fee718fd4f8c047780cf51;p=thirdparty%2Fvalgrind.git Bug 445235 - Java/Ada/D demangling is probably broken Ada demangling is now functional. There maybe some missing functionality like the _GLOBAL_ mentioned in the bugzilla item. --- diff --git a/.gitignore b/.gitignore index 6d650feba..8275e9f90 100644 --- a/.gitignore +++ b/.gitignore @@ -869,6 +869,7 @@ /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 a0b02faf3..b375fa268 100644 --- 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 diff --git a/coregrind/m_demangle/demangle.c b/coregrind/m_demangle/demangle.c index a4031dc8a..ca066a4b0 100644 --- a/coregrind/m_demangle/demangle.c +++ b/coregrind/m_demangle/demangle.c @@ -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 ); } diff --git a/coregrind/m_redir.c b/coregrind/m_redir.c index f50624c2b..f9e8d8801 100644 --- a/coregrind/m_redir.c +++ b/coregrind/m_redir.c @@ -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, diff --git a/coregrind/pub_core_demangle.h b/coregrind/pub_core_demangle.h index 86990831f..1532251b2 100644 --- a/coregrind/pub_core_demangle.h +++ b/coregrind/pub_core_demangle.h @@ -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 /*--------------------------------------------------------------------*/ diff --git a/memcheck/tests/Makefile.am b/memcheck/tests/Makefile.am index 19ac76730..c3b5fdbe9 100644 --- a/memcheck/tests/Makefile.am +++ b/memcheck/tests/Makefile.am @@ -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 index 000000000..798980c57 --- /dev/null +++ b/memcheck/tests/bug445235_ada_demangle.c @@ -0,0 +1,40 @@ +#include +#include +#include +#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 index 000000000..8623f7298 --- /dev/null +++ b/memcheck/tests/bug445235_ada_demangle.stderr.exp @@ -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 index 000000000..d8d263351 --- /dev/null +++ b/memcheck/tests/bug445235_ada_demangle.vgtest @@ -0,0 +1,2 @@ +prog: bug445235_ada_demangle +vgopts: -q