abi::__cxx_demangle appears to be broken on vanilla freebsd-13.0

From: Benjamin Bannier <benjamin.bannier_at_corelight.com>
Date: Fri, 06 May 2022 12:25:54 UTC
Hi,

I am trying to add support for a C++ program which makes use of `abi::__cxx_demangle` for name unmangling. This worked well up to freebsd-12.2, but appears to be broken on a vanilla 13.0.

Example:

       // foo.cc
       #include <cxxabi.h>
       #include <iostream>
       #include <typeinfo>

       int main() {
         const std::type_info &info = typeid(std::type_info);

         const char *name = info.name();
         int status = 0;

         const char *dname = abi::__cxa_demangle(name, NULL, NULL, &status);

         if (status != 0) {
           std::cerr << "status=" << status << ' ' << name << '\n';
           return 0;
         }

         std::cerr << name << ' ' << dname << '\n';
       }

This can be built with e.g., `make`:

       make foo

If I run this on a vanilla freebsd-12.2 `__cxa_demangle` can demangle the name as mangled by the system:

       $ ./foo
       St9type_info std::type_info

On vanilla freebsd-13.0 OTOH `__cxa_demangle` reports `status=-2` which according to https://panthema.net/2008/0901-stacktrace-demangled/cxa_demangle.html means:

> -2: mangled_name is not a valid name under the C++ ABI mangling rules.

I found a number of issues in bugzilla on broken unmangling in `c++filt` and mentions of workaround which went in to fix that, but on a vanilla 13.0 even `c++filt` seems unable to demangle `name`. I also found https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=222563 which seems to have staled for a long time (left a ping there).

Could somebody point me to a way to fix this behavior? I cannot image that I am the only one having this issue.


Cheers,

Benjamin