From d7c63220746fd06bc4e5905ae072707da2c389e2 Mon Sep 17 00:00:00 2001 From: Francis Ricci Date: Fri, 6 Oct 2017 15:33:28 +0000 Subject: [PATCH] [llvm-objdump] Add RAII for xar apis Summary: xar_open and xar_iter_new require manual calls to close/free functions to deallocate resources. This makes it easy to introduce memory leaks, so add RAII struct wrappers for these resources. Reviewers: enderby, rafael, compnerd, lhames, dblaikie Subscribers: llvm-commits Differential Revision: https://reviews.llvm.org/D38598 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@315069 91177308-0d34-0410-b5e6-96231b3b80d8 --- tools/llvm-objdump/MachODump.cpp | 48 ++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp index e9b531fb50d..031427cf4d9 100644 --- a/tools/llvm-objdump/MachODump.cpp +++ b/tools/llvm-objdump/MachODump.cpp @@ -202,6 +202,34 @@ typedef std::pair DiceTableEntry; typedef std::vector DiceTable; typedef DiceTable::iterator dice_table_iterator; +namespace { +struct ScopedXarFile { + xar_t xar; + ScopedXarFile(const char *filename, int32_t flags) { + xar = xar_open(filename, flags); + } + ~ScopedXarFile() { + if (xar) + xar_close(xar); + } + ScopedXarFile(const ScopedXarFile &) = delete; + ScopedXarFile &operator=(const ScopedXarFile &) = delete; + operator xar_t() { return xar; } +}; + +struct ScopedXarIter { + xar_iter_t iter; + ScopedXarIter() { iter = xar_iter_new(); } + ~ScopedXarIter() { + if (iter) + xar_iter_free(iter); + } + ScopedXarIter(const ScopedXarIter &) = delete; + ScopedXarIter &operator=(const ScopedXarIter &) = delete; + operator xar_iter_t() { return iter; } +}; +} // namespace + // This is used to search for a data in code table entry for the PC being // disassembled. The j parameter has the PC in j.first. A single data in code // table entry can cover many bytes for each of its Kind's. So if the offset, @@ -5802,14 +5830,12 @@ static void PrintModeVerbose(uint32_t mode) { } static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) { - xar_iter_t xi; xar_file_t xf; - xar_iter_t xp; const char *key, *type, *mode, *user, *group, *size, *mtime, *name, *m; char *endp; uint32_t mode_value; - xi = xar_iter_new(); + ScopedXarIter xi; if (!xi) { errs() << "Can't obtain an xar iterator for xar archive " << XarFilename << "\n"; @@ -5818,7 +5844,7 @@ static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) { // Go through the xar's files. for (xf = xar_file_first(xar, xi); xf; xf = xar_file_next(xi)) { - xp = xar_iter_new(); + ScopedXarIter xp; if(!xp){ errs() << "Can't obtain an xar iterator for xar archive " << XarFilename << "\n"; @@ -5880,9 +5906,7 @@ static void PrintXarFilesSummary(const char *XarFilename, xar_t xar) { if(name != nullptr) outs() << name; outs() << "\n"; - xar_iter_free(xp); } - xar_iter_free(xi); } static void DumpBitcodeSection(MachOObjectFile *O, const char *sect, @@ -5958,7 +5982,7 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect, if (XarOut.has_error()) return; - xar_t xar = xar_open(XarFilename.c_str(), READ); + ScopedXarFile xar(XarFilename.c_str(), READ); if (!xar) { errs() << "Can't create temporary xar archive " << XarFilename << "\n"; return; @@ -5998,24 +6022,21 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect, outs() << Buffer->getBuffer() << "\n"; // TODO: Go through the xar's files. - xar_iter_t xi = xar_iter_new(); + ScopedXarIter xi; if(!xi){ errs() << "Can't obtain an xar iterator for xar archive " << XarFilename.c_str() << "\n"; - xar_close(xar); return; } for(xar_file_t xf = xar_file_first(xar, xi); xf; xf = xar_file_next(xi)){ const char *key; - xar_iter_t xp; const char *member_name, *member_type, *member_size_string; size_t member_size; - xp = xar_iter_new(); + ScopedXarIter xp; if(!xp){ errs() << "Can't obtain an xar iterator for xar archive " << XarFilename.c_str() << "\n"; - xar_close(xar); return; } member_name = NULL; @@ -6080,10 +6101,7 @@ static void DumpBitcodeSection(MachOObjectFile *O, const char *sect, } } } - xar_iter_free(xp); } - xar_iter_free(xi); - xar_close(xar); } #endif // defined(HAVE_LIBXAR)