From 26ef617c259a8e0b08b48ba49d50d70d81b3a8b2 Mon Sep 17 00:00:00 2001 From: Jeremy Rifkin <51220084+jeremy-rifkin@users.noreply.github.com> Date: Tue, 18 Feb 2025 19:48:53 -0600 Subject: [PATCH] Use a raii_wrapper for the char array returned by abi::__cxa_demangle --- src/demangle/demangle_with_cxxabi.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/demangle/demangle_with_cxxabi.cpp b/src/demangle/demangle_with_cxxabi.cpp index f089680..39f68f8 100644 --- a/src/demangle/demangle_with_cxxabi.cpp +++ b/src/demangle/demangle_with_cxxabi.cpp @@ -39,13 +39,14 @@ namespace detail { // it appears safe to pass nullptr for status however the docs don't explicitly say it's safe so I don't // want to rely on it int status; - char* const demangled = abi::__cxa_demangle(to_demangle.get().c_str() + offset, nullptr, nullptr, &status); + auto demangled = raii_wrap( + abi::__cxa_demangle(to_demangle.get().c_str() + offset, nullptr, nullptr, &status), + [] (char* str) { std::free(str); } + ); // demangled will always be nullptr on non-zero status, and if __cxa_demangle ever fails for any reason // we'll just quietly return the mangled name - if(demangled) { - // TODO: raii_wrap the char*? - std::string str = demangled; - std::free(demangled); + if(demangled.get()) { + std::string str = demangled.get(); if(!rest.empty()) { str += rest; }