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

David Chisnall theraven at FreeBSD.org
Wed Jun 11 12:41:31 UTC 2014


On 11 Jun 2014, at 13:30, Kai Wang <kaiw at FreeBSD.org> wrote:

> On Tue, Jun 10, 2014 at 07:38:19AM +0100, David Chisnall wrote:
>> On 10 Jun 2014, at 03:44, Ed Maste <emaste at freebsd.org> wrote:
>> 
>>> I had the same issue in LLVM, and as hacky as it seems, the solution
>>> is to check that the name starts with "_Z" before passing it to
>>> __cxa_demangle.
>>> 
>>> For reference the LLVM review for the change is here:
>>> http://reviews.llvm.org/D2552
>>> 
>>> I didn't get around to testing it on Linux; since you have a test
>>> application ready it would be interesting to see the result of
>>> __cxa_demangle("f") there.
>> 
>> 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 _.
>> 
>> 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.
>> 
>> The demangler that we ship is from libelftc.  It also fails on a number of C++11 types and doesn't handle some complex template cases.  
> 
> Hi David,
> 
> If possible, could you list a few examples that the demangler can not
> handle?  Maybe we can fix this in libelftc and merge it back later.

Your best reference for this is the libc++abi test suite:

http://llvm.org/viewvc/llvm-project/libcxxabi/trunk/test/test_demangle.cpp?revision=208611&view=markup

New C++11 additions and template arguments that are forward references are not very well handled.  It would be great if there were any improvements.

It would also be good for libcxxrt if the demangler could avoid having to allocate any memory except on the stack, as one of the places where it's used is in reporting out-of-memory conditions.

David




More information about the freebsd-toolchain mailing list