From 7a40dc90ae5cba33bc15fca337b49c103b467c17 Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Sun, 8 Jan 2017 20:50:53 +0300 Subject: [PATCH] Qualify all the calls, do not mix std:: and :: function usage, detail::pc_data refactored to avoid copying --- .../boost/stacktrace/detail/backend_posix.hpp | 136 ++++++++---------- .../stacktrace/detail/backend_windows.hpp | 16 +-- 2 files changed, 71 insertions(+), 81 deletions(-) diff --git a/include/boost/stacktrace/detail/backend_posix.hpp b/include/boost/stacktrace/detail/backend_posix.hpp index 514c057..748747a 100644 --- a/include/boost/stacktrace/detail/backend_posix.hpp +++ b/include/boost/stacktrace/detail/backend_posix.hpp @@ -36,8 +36,8 @@ namespace boost { namespace stacktrace { namespace detail { #ifdef BOOST_STACKTRACE_USE_ADDR2LINE class addr2line_pipe { - FILE* p; - pid_t pid; + ::FILE* p; + ::pid_t pid; public: explicit addr2line_pipe(const char *flag, const char* exec_path, const char* addr) BOOST_NOEXCEPT @@ -54,43 +54,43 @@ public: 0 }; - if (pipe(pdes) < 0) { + if (::pipe(pdes) < 0) { return; } - pid = fork(); + pid = ::fork(); switch (pid) { case -1: // failed - close(pdes[0]); - close(pdes[1]); + ::close(pdes[0]); + ::close(pdes[1]); return; case 0: // we are the child - close(STDERR_FILENO); - close(pdes[0]); + ::close(STDERR_FILENO); + ::close(pdes[0]); if (pdes[1] != STDOUT_FILENO) { - dup2(pdes[1], STDOUT_FILENO); + ::dup2(pdes[1], STDOUT_FILENO); } - execvp(prog_name, argp); - _exit(127); + ::execvp(prog_name, argp); + ::_exit(127); } - p = fdopen(pdes[0], "r"); - close(pdes[1]); + p = ::fdopen(pdes[0], "r"); + ::close(pdes[1]); } - operator FILE*() const BOOST_NOEXCEPT { + operator ::FILE*() const BOOST_NOEXCEPT { return p; } ~addr2line_pipe() BOOST_NOEXCEPT { if (p) { - fclose(p); + ::fclose(p); int pstat = 0; - kill(pid, SIGKILL); - waitpid(pid, &pstat, 0); + ::kill(pid, SIGKILL); + ::waitpid(pid, &pstat, 0); } } }; @@ -98,15 +98,15 @@ public: inline std::string addr2line(const char* flag, const void* addr) { std::string res; - Dl_info dli; - if (!!dladdr(addr, &dli) && dli.dli_fname) { + ::Dl_info dli; + if (!!::dladdr(addr, &dli) && dli.dli_fname) { res = dli.dli_fname; } else { res.resize(16); - int rlin_size = readlink("/proc/self/exe", &res[0], res.size() - 1); + int rlin_size = ::readlink("/proc/self/exe", &res[0], res.size() - 1); while (rlin_size == static_cast(res.size() - 1)) { res.resize(res.size() * 4); - rlin_size = readlink("/proc/self/exe", &res[0], res.size() - 1); + rlin_size = ::readlink("/proc/self/exe", &res[0], res.size() - 1); } if (rlin_size == -1) { res.clear(); @@ -123,8 +123,8 @@ inline std::string addr2line(const char* flag, const void* addr) { } char data[32]; - while (!std::feof(p)) { - if (std::fgets(data, sizeof(data), p)) { + while (!::feof(p)) { + if (::fgets(data, sizeof(data), p)) { res += data; } else { break; @@ -143,21 +143,18 @@ inline std::string addr2line(const char* flag, const void* addr) { #ifdef BOOST_STACKTRACE_USE_BACKTRACE struct pc_data { - unsigned is_function : 1; - unsigned is_filename : 1; - - std::string function; - std::string filename; + std::string* function; + std::string* filename; std::size_t line; }; -static int libbacktrace_full_callback(void *data, uintptr_t pc, const char *filename, int lineno, const char *function) { +static int libbacktrace_full_callback(void *data, uintptr_t /*pc*/, const char *filename, int lineno, const char *function) { pc_data& d = *static_cast(data); - if (d.is_filename && filename) { - d.filename = filename; + if (d.filename && filename) { + *d.filename = filename; } - if (d.is_function && function) { - d.function = function; + if (d.function && function) { + *d.function = function; } d.line = lineno; return 0; @@ -184,17 +181,17 @@ struct unwind_state { void** end; }; -inline _Unwind_Reason_Code unwind_callback(struct _Unwind_Context* context, void* arg) { +inline _Unwind_Reason_Code unwind_callback(::_Unwind_Context* context, void* arg) { unwind_state* state = static_cast(arg); *state->current = reinterpret_cast( - _Unwind_GetIP(context) + ::_Unwind_GetIP(context) ); ++state->current; if (!*(state->current - 1) || state->current == state->end) { - return _URC_END_OF_STACK; + return ::_URC_END_OF_STACK; } - return _URC_NO_REASON; + return ::_URC_NO_REASON; } std::size_t backend::collect(void** memory, std::size_t size) BOOST_NOEXCEPT { @@ -204,7 +201,7 @@ std::size_t backend::collect(void** memory, std::size_t size) BOOST_NOEXCEPT { } unwind_state state = { memory, memory + size }; - _Unwind_Backtrace(&unwind_callback, &state); + ::_Unwind_Backtrace(&unwind_callback, &state); frames_count = state.current - memory; if (memory[frames_count - 1] == 0) { @@ -217,24 +214,22 @@ std::size_t backend::collect(void** memory, std::size_t size) BOOST_NOEXCEPT { #ifdef BOOST_STACKTRACE_USE_BACKTRACE inline std::string to_string_impl(const void* addr, ::backtrace_state* state) { std::string res; + std::string filename; - boost::stacktrace::detail::pc_data data; - data.is_function = 1; - data.is_filename = 1; - backtrace_pcinfo(state, reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); - res.swap(data.function); + boost::stacktrace::detail::pc_data data = {&res, &filename, 0}; + ::backtrace_pcinfo(state, reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); if (res.empty()) { res = to_hex_array(addr).data(); } - if (!data.filename.empty() && data.line) { + if (!filename.empty() && data.line) { res += " at "; - res += data.filename; + res += filename; res += ':'; res += boost::lexical_cast >(data.line).data(); } else { - Dl_info dli; - if (!!dladdr(addr, &dli) && dli.dli_sname) { + ::Dl_info dli; + if (!!::dladdr(addr, &dli) && dli.dli_sname) { res += " in "; res += dli.dli_fname; } @@ -244,7 +239,7 @@ inline std::string to_string_impl(const void* addr, ::backtrace_state* state) { } std::string backend::to_string(const void* addr) { - ::backtrace_state* state = backtrace_create_state( + ::backtrace_state* state = ::backtrace_create_state( 0, 0, 0, 0 ); return boost::stacktrace::detail::to_string_impl(addr, state); @@ -267,8 +262,8 @@ std::string backend::to_string(const void* addr) { } #endif - Dl_info dli; - if (!!dladdr(addr, &dli) && dli.dli_sname) { + ::Dl_info dli; + if (!!::dladdr(addr, &dli) && dli.dli_sname) { res += " in "; res += dli.dli_fname; } @@ -283,7 +278,7 @@ std::string backend::to_string(const frame* frames, std::size_t size) { res.reserve(64 * size); #ifdef BOOST_STACKTRACE_USE_BACKTRACE - ::backtrace_state* state = backtrace_create_state( + ::backtrace_state* state = ::backtrace_create_state( 0, 0, 0, 0 ); #endif @@ -314,22 +309,21 @@ std::string backend::to_string(const frame* frames, std::size_t size) { std::string frame::name() const { std::string res; - Dl_info dli; - const bool dl_ok = !!dladdr(addr_, &dli); + ::Dl_info dli; + const bool dl_ok = !!::dladdr(addr_, &dli); if (dl_ok && dli.dli_sname) { res = boost::stacktrace::detail::try_demangle(dli.dli_sname); } else { #ifdef BOOST_STACKTRACE_USE_BACKTRACE - ::backtrace_state* state = backtrace_create_state( + ::backtrace_state* state = ::backtrace_create_state( (dl_ok ? dli.dli_fname : 0), 0, 0, 0 ); - boost::stacktrace::detail::pc_data data; - data.is_function = 1; - data.is_filename = 0; - backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); - if (!data.function.empty()) { - return boost::stacktrace::detail::try_demangle(data.function.c_str()); + boost::stacktrace::detail::pc_data data = {&res, 0, 0}; + ::backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); + if (!res.empty()) { + res = boost::stacktrace::detail::try_demangle(res.c_str()); + return res; } #endif #ifdef BOOST_STACKTRACE_USE_ADDR2LINE @@ -347,21 +341,19 @@ std::string frame::name() const { } std::string frame::source_file() const { + std::string res; #ifdef BOOST_STACKTRACE_USE_BACKTRACE - ::backtrace_state* state = backtrace_create_state( + ::backtrace_state* state = ::backtrace_create_state( 0, 0, 0, 0 ); - boost::stacktrace::detail::pc_data data; - data.is_function = 0; - data.is_filename = 1; - backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); - if (!data.filename.empty()) { - return data.filename; + boost::stacktrace::detail::pc_data data = {0, &res, 0}; + ::backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); + if (!res.empty()) { + return res; } #endif - std::string res; #ifdef BOOST_STACKTRACE_USE_ADDR2LINE res = boost::stacktrace::detail::addr2line("-e", addr_); res = res.substr(0, res.find_last_of(':')); @@ -374,14 +366,12 @@ std::string frame::source_file() const { std::size_t frame::source_line() const { #ifdef BOOST_STACKTRACE_USE_BACKTRACE - ::backtrace_state* state = backtrace_create_state( + ::backtrace_state* state = ::backtrace_create_state( 0, 0, 0, 0 ); - boost::stacktrace::detail::pc_data data; - data.is_function = 0; - data.is_filename = 0; - backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); + boost::stacktrace::detail::pc_data data = {0, 0, 0}; + ::backtrace_pcinfo(state, reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, 0, &data); if (data.line) { return data.line; } diff --git a/include/boost/stacktrace/detail/backend_windows.hpp b/include/boost/stacktrace/detail/backend_windows.hpp index e8f4d77..04745ee 100644 --- a/include/boost/stacktrace/detail/backend_windows.hpp +++ b/include/boost/stacktrace/detail/backend_windows.hpp @@ -29,10 +29,10 @@ class com_global_initer: boost::noncopyable { public: com_global_initer() BOOST_NOEXCEPT { // We do not care about the result of the function call: any result is OK for us. - CoInitializeEx(0, COINIT_MULTITHREADED); + ::CoInitializeEx(0, COINIT_MULTITHREADED); } ~com_global_initer() BOOST_NOEXCEPT { - CoUninitialize(); + ::CoUninitialize(); } }; @@ -66,16 +66,16 @@ public: }; -inline bool try_init_com(com_holder& idebug, const com_global_initer& com) BOOST_NOEXCEPT { - com_holder iclient(com); - DebugCreate(__uuidof(IDebugClient), iclient.to_void_ptr_ptr()); +inline bool try_init_com(com_holder<::IDebugSymbols>& idebug, const com_global_initer& com) BOOST_NOEXCEPT { + com_holder<::IDebugClient> iclient(com); + ::DebugCreate(__uuidof(IDebugClient), iclient.to_void_ptr_ptr()); - com_holder icontrol(com); + com_holder<::IDebugControl> icontrol(com); iclient->QueryInterface(__uuidof(IDebugControl), icontrol.to_void_ptr_ptr()); const bool res1 = (S_OK == iclient->AttachProcess( 0, - GetCurrentProcessId(), + ::GetCurrentProcessId(), DEBUG_ATTACH_NONINVASIVE | DEBUG_ATTACH_NONINVASIVE_NO_SUSPEND) ); if (!res1) { @@ -97,7 +97,7 @@ inline bool try_init_com(com_holder& idebug, const com_global_ini std::size_t backend::collect(void** memory, std::size_t size) BOOST_NOEXCEPT { - return CaptureStackBackTrace( + return ::CaptureStackBackTrace( 0, static_cast(size), memory,