[lldb] Fix RichManglingContext::FromCxxMethodName() leak

`RichManglingContext::FromCxxMethodName` allocates a m_cxx_method_parser, but never deletes it.

This fixes a `-DLLVM_USE_SANITIZER=Leaks` failure.

Reviewed By: teemperor

Differential Revision: https://reviews.llvm.org/D100795
This commit is contained in:
Jordan Rupprecht 2021-04-19 14:32:26 -07:00
parent 62cdcd6c5a
commit eb5e11f460
2 changed files with 17 additions and 2 deletions

View File

@ -29,7 +29,7 @@ public:
m_ipd_buf[0] = '\0';
}
~RichManglingContext() { std::free(m_ipd_buf); }
~RichManglingContext();
/// Use the ItaniumPartialDemangler to obtain rich mangling information from
/// the given mangled name.
@ -77,6 +77,9 @@ private:
/// Members for ItaniumPartialDemangler
llvm::ItaniumPartialDemangler m_ipd;
/// Note: m_ipd_buf is a raw pointer due to being resized by realloc via
/// ItaniumPartialDemangler. It should be managed with malloc/free, not
/// new/delete.
char *m_ipd_buf;
size_t m_ipd_buf_size;
@ -86,6 +89,9 @@ private:
/// dependency. Instead keep a llvm::Any and cast it on-access in the cpp.
llvm::Any m_cxx_method_parser;
/// Clean up memory when using PluginCxxLanguage
void ResetCxxMethodParser();
/// Clean up memory and set a new info provider for this instance.
void ResetProvider(InfoProvider new_provider);

View File

@ -19,7 +19,12 @@ using namespace lldb;
using namespace lldb_private;
// RichManglingContext
void RichManglingContext::ResetProvider(InfoProvider new_provider) {
RichManglingContext::~RichManglingContext() {
std::free(m_ipd_buf);
ResetCxxMethodParser();
}
void RichManglingContext::ResetCxxMethodParser() {
// If we want to support parsers for other languages some day, we need a
// switch here to delete the correct parser type.
if (m_cxx_method_parser.hasValue()) {
@ -27,6 +32,10 @@ void RichManglingContext::ResetProvider(InfoProvider new_provider) {
delete get<CPlusPlusLanguage::MethodName>(m_cxx_method_parser);
m_cxx_method_parser.reset();
}
}
void RichManglingContext::ResetProvider(InfoProvider new_provider) {
ResetCxxMethodParser();
assert(new_provider != None && "Only reset to a valid provider");
m_provider = new_provider;