abi::__cxa_demangle provides invalid result on non-mangled symbols

Ed Maste emaste at freebsd.org
Wed Jun 11 20:53:43 UTC 2014


On 10 June 2014 02:38, David Chisnall <theraven at freebsd.org> wrote:
>
> If you know that the thing that you are demangling is a symbol name, then you can use the _Z check, which isn't really a hack - it's a marker added to identify C++ symbols.  Note that, if you're writing portable code, you need to remember that some systems prepend an underscore to all compiler-generated symbols, so you may also need to check for __Z and trim the leading _.

Right, it just feels hackish to have to know this detail of the ABI.
I think I'd like an explicit __cxa_demangle_symbol interface, or
perhaps __cxa_is_mangled_symbol to query a string.

> The __cxa_demangle() function has to handle things that are not just symbols (types and so on) and so can't do this test itself.  Its most common use is generating a human-friendly error for an uncaught exception, where it is just parsing a type encoding.

My use, and I suspect Ryan's, is demangling symbols obtained from
introspection interfaces like backtrace_symbols(3).

In any case, our libelftc __cxa_demangle accepts strings that are
neither symbols nor NTBS manglings, and can return a bogus demangled
name for them.  Of course, it's a mistake to rely on __cxa_demangle
rejecting these for arbitrary input.


More information about the freebsd-toolchain mailing list