Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 10 Jun 2014 07:38:19 +0100
From:      David Chisnall <theraven@FreeBSD.org>
To:        Ed Maste <emaste@freebsd.org>
Cc:        freebsd-toolchain@freebsd.org, Ryan Stone <rysto32@gmail.com>
Subject:   Re: abi::__cxa_demangle provides invalid result on non-mangled symbols
Message-ID:  <9BDAE8E2-0573-4526-9136-97D3492D7DEF@FreeBSD.org>
In-Reply-To: <CAPyFy2Buh4BUEuYW5nfQFdEMio9=yaDAkivg1zXPnEBzr_CzJQ@mail.gmail.com>
References:  <CAFMmRNw_9hS3YuDbjFJH0btvoPADJ7_4=L13z2sK71gctPzXhQ@mail.gmail.com> <CAPyFy2Buh4BUEuYW5nfQFdEMio9=yaDAkivg1zXPnEBzr_CzJQ@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On 10 Jun 2014, at 03:44, Ed Maste <emaste@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.
>=20
> For reference the LLVM review for the change is here:
> http://reviews.llvm.org/D2552
>=20
> 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. =20

David




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?9BDAE8E2-0573-4526-9136-97D3492D7DEF>