diff --git a/src/binary/mach-o.cpp b/src/binary/mach-o.cpp index 2d1cdd3..e889cbd 100644 --- a/src/binary/mach-o.cpp +++ b/src/binary/mach-o.cpp @@ -642,12 +642,12 @@ namespace detail { return common; } - Result, internal_error> mach_o::load_string_table(std::uint32_t offset, std::uint32_t byte_count) const { - std::unique_ptr buffer(new char[byte_count + 1]); + Result, internal_error> mach_o::load_string_table(std::uint32_t offset, std::uint32_t byte_count) const { + std::vector buffer(byte_count + 1); if(std::fseek(file, load_base + offset, SEEK_SET) != 0) { return internal_error("fseek error while loading mach-o symbol table"); } - if(std::fread(buffer.get(), sizeof(char), byte_count, file) != byte_count) { + if(std::fread(buffer.data(), sizeof(char), byte_count, file) != byte_count) { return internal_error("fread error while loading mach-o symbol table"); } buffer[byte_count] = 0; // just out of an abundance of caution diff --git a/src/binary/mach-o.hpp b/src/binary/mach-o.hpp index fdf0df4..9f570f4 100644 --- a/src/binary/mach-o.hpp +++ b/src/binary/mach-o.hpp @@ -63,7 +63,7 @@ namespace detail { struct symtab_info_data { symtab_command symtab; - std::unique_ptr stringtab; + std::vector stringtab; Result get_string(std::size_t index) const; }; @@ -131,7 +131,7 @@ namespace detail { template Result load_symtab_entry(std::uint32_t symbol_base, std::size_t index) const; - Result, internal_error> load_string_table(std::uint32_t offset, std::uint32_t byte_count) const; + Result, internal_error> load_string_table(std::uint32_t offset, std::uint32_t byte_count) const; bool should_swap() const; }; diff --git a/src/symbols/dwarf/debug_map_resolver.cpp b/src/symbols/dwarf/debug_map_resolver.cpp index a340335..a7bdbae 100644 --- a/src/symbols/dwarf/debug_map_resolver.cpp +++ b/src/symbols/dwarf/debug_map_resolver.cpp @@ -34,7 +34,7 @@ namespace libdwarf { if(!resolver) { // this seems silly but it's an attempt to not repeatedly try to initialize new dwarf_resolvers if // exceptions are thrown, e.g. if the path doesn't exist - resolver = std::unique_ptr(new null_resolver); + resolver = detail::make_unique(); resolver = make_dwarf_resolver(object_path); } return resolver; @@ -198,7 +198,7 @@ namespace libdwarf { }; std::unique_ptr make_debug_map_resolver(const std::string& object_path) { - return std::unique_ptr(new debug_map_resolver(object_path)); + return detail::make_unique(object_path); } #endif } diff --git a/src/symbols/dwarf/dwarf_resolver.cpp b/src/symbols/dwarf/dwarf_resolver.cpp index f62e460..0aee279 100644 --- a/src/symbols/dwarf/dwarf_resolver.cpp +++ b/src/symbols/dwarf/dwarf_resolver.cpp @@ -932,12 +932,7 @@ namespace libdwarf { if(it == split_full_cu_resolvers.end()) { it = split_full_cu_resolvers.emplace( off, - std::unique_ptr( - new dwarf_resolver( - path, - skeleton_info{cu_die.clone(), dwversion, *this} - ) - ) + detail::make_unique(path, skeleton_info{cu_die.clone(), dwversion, *this}) ).first; } res = it->second->resolve_frame(object_frame_info); @@ -1015,7 +1010,7 @@ namespace libdwarf { }; std::unique_ptr make_dwarf_resolver(const std::string& object_path) { - return std::unique_ptr(new dwarf_resolver(object_path)); + return detail::make_unique(object_path); } } } diff --git a/src/symbols/symbols_with_dbghelp.cpp b/src/symbols/symbols_with_dbghelp.cpp index b691db1..22b168e 100644 --- a/src/symbols/symbols_with_dbghelp.cpp +++ b/src/symbols/symbols_with_dbghelp.cpp @@ -6,6 +6,7 @@ #include "binary/object.hpp" #include "utils/common.hpp" #include "utils/error.hpp" +#include "utils/utils.hpp" #include "options.hpp" #include @@ -239,6 +240,9 @@ namespace dbghelp { std::size_t sz = sizeof(TI_FINDCHILDREN_PARAMS) + (n_children) * sizeof(TI_FINDCHILDREN_PARAMS::ChildId[0]); TI_FINDCHILDREN_PARAMS* children = (TI_FINDCHILDREN_PARAMS*) new char[sz]; + auto guard = scope_exit([&] { + delete[] (char*) children; + }); children->Start = 0; children->Count = n_children; if( @@ -264,7 +268,6 @@ namespace dbghelp { extent += (i == 0 ? "" : ", ") + resolve_type(children->ChildId[i], proc, modbase); } extent += ")"; - delete[] (char*) children; return {return_type.base, extent + return_type.extent}; } }