From 2ffe116322aa4373d408a72b665fa7fe7a504d4a Mon Sep 17 00:00:00 2001 From: "Yngve N. Pettersen" Date: Tue, 5 May 2020 02:06:14 +0200 Subject: =?UTF-8?q?mac:=20Don=E2=80=99t=20try=20to=20demangle=20non-C++=20?= =?UTF-8?q?symbols=20with=20the=20C++=20demangler?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Mac a C++ symbol has 1-4 underscore characters followed by a 'Z'. Symbols that do not have this format (such as plain C symbols) causes a lot of warnings to be printed. Bug: chromium:1062556 Change-Id: I55977f756c7e20cc5e7b1cb8e38316d7bf1f748c Reviewed-on: https://chromium-review.googlesource.com/c/breakpad/breakpad/+/2179482 Reviewed-by: Mark Mentovai --- src/common/language.cc | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'src') diff --git a/src/common/language.cc b/src/common/language.cc index 978fb855..d26e5638 100644 --- a/src/common/language.cc +++ b/src/common/language.cc @@ -79,6 +79,18 @@ class CPPLanguage: public Language { demangled->clear(); return kDontDemangle; #else +#if defined(__APPLE__) + // Mac C++ symbols can have up to 4 underscores, followed by a "Z". + // Non-C++ symbols are not coded that way, but may have leading underscores. + // Attempting to demangle non-C++ symbols with the C++ demangler would print + // warnings and fail, so return kDontDemangle for these. + size_t i = mangled.find_first_not_of('_'); + if (i == 0 || i == string::npos || i > 4 || mangled[i] != 'Z') { + demangled->clear(); + return kDontDemangle; + } +#endif + int status; char* demangled_c = abi::__cxa_demangle(mangled.c_str(), NULL, NULL, &status); -- cgit v1.2.1