From f6a380008c863d6f61732f008194848849392cbd Mon Sep 17 00:00:00 2001 From: ClausKlein Date: Mon, 24 Aug 2026 21:12:30 +0200 Subject: [PATCH] Use std::uintptr_t And sync CMakeLists.txt with other modules --- CMakeLists.txt | 8 +++---- .../stacktrace/detail/addr2line_impls.hpp | 21 ++++++++++--------- include/boost/stacktrace/detail/addr_base.hpp | 21 ++++++++++--------- .../boost/stacktrace/detail/frame_msvc.ipp | 8 +++---- .../boost/stacktrace/detail/frame_unwind.ipp | 2 +- .../stacktrace/detail/libbacktrace_impls.hpp | 20 +++++++++--------- modules/boost_stacktrace_dump.cppm | 8 +++++-- test/test.cpp | 10 ++++----- 8 files changed, 52 insertions(+), 46 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index c753f23f..314b6fd6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,7 +3,7 @@ # Distributed under the Boost Software License, Version 1.0. # https://www.boost.org/LICENSE_1_0.txt -cmake_minimum_required(VERSION 3.8...4.20) +cmake_minimum_required(VERSION 3.8...4.4) project(boost_stacktrace VERSION "${BOOST_SUPERPROJECT_VERSION}" LANGUAGES CXX) @@ -11,14 +11,14 @@ function(stacktrace_add_module name import_std) target_sources(${name} PUBLIC FILE_SET CXX_MODULES - BASE_DIRS "${CMAKE_CURRENT_LIST_DIR}/modules" - FILES "${CMAKE_CURRENT_LIST_DIR}/modules/${name}.cppm" + BASE_DIRS modules + FILES "modules/${name}.cppm" ) target_compile_definitions(${name} PUBLIC BOOST_USE_MODULES) if(${import_std}) target_compile_features(${name} PUBLIC cxx_std_23) - target_compile_definitions(${name} PRIVATE BOOST_STACKTRACE_USE_STD_MODULE) + target_compile_definitions(${name} PUBLIC BOOST_STACKTRACE_USE_STD_MODULE) else() target_compile_features(${name} PUBLIC cxx_std_20) endif() diff --git a/include/boost/stacktrace/detail/addr2line_impls.hpp b/include/boost/stacktrace/detail/addr2line_impls.hpp index f2e3b293..58af5696 100644 --- a/include/boost/stacktrace/detail/addr2line_impls.hpp +++ b/include/boost/stacktrace/detail/addr2line_impls.hpp @@ -12,11 +12,12 @@ # pragma once #endif +#include // std::strchr +#include // fclose, fdopen, dup2 + #if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) #include -#include -#include #include #include @@ -163,11 +164,11 @@ inline std::string addr2line(const char* flag, const void* addr) { } inline std::string source_location(const void* addr, bool position_independent) { - uintptr_t addr_base = 0; + std::uintptr_t addr_base = 0; if (position_independent) { addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); std::string source_line = boost::stacktrace::detail::addr2line("-Cpe", reinterpret_cast(offset)); if (source_line.empty() || source_line[0] == '?') { return ""; @@ -210,11 +211,11 @@ template class to_string_impl_base; typedef to_string_impl_base to_string_impl; inline std::string name(const void* addr, bool position_independent) { - uintptr_t addr_base = 0; + std::uintptr_t addr_base = 0; if(position_independent){ addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); std::string res = boost::stacktrace::detail::addr2line("-fe", offset); res = res.substr(0, res.find_last_of('\n')); res = boost::core::demangle(res.c_str()); @@ -237,11 +238,11 @@ inline std::string name_impl(const void* addr) { inline std::string source_file(const void* addr, bool position_independent) { std::string res; - uintptr_t addr_base = 0; + std::uintptr_t addr_base = 0; if(position_independent){ addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); res = boost::stacktrace::detail::addr2line("-e", offset); res = res.substr(0, res.find_last_of(':')); if (res == "??") { @@ -253,11 +254,11 @@ inline std::string source_file(const void* addr, bool position_independent) { inline std::size_t source_line(const void* addr, bool position_independent) { std::size_t line_num = 0; - uintptr_t addr_base = 0; + std::uintptr_t addr_base = 0; if(position_independent){ addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr); } - const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); + const void* offset = reinterpret_cast(reinterpret_cast(addr) - addr_base); std::string res = boost::stacktrace::detail::addr2line("-e", offset); const std::size_t last = res.find_last_of(':'); if (last == std::string::npos) { diff --git a/include/boost/stacktrace/detail/addr_base.hpp b/include/boost/stacktrace/detail/addr_base.hpp index 6a36c825..3097d4cf 100644 --- a/include/boost/stacktrace/detail/addr_base.hpp +++ b/include/boost/stacktrace/detail/addr_base.hpp @@ -15,25 +15,26 @@ #if !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) #include #include -#include -#include +#include // std::uintptr_t +#include +#include #endif // !defined(BOOST_STACKTRACE_INTERFACE_UNIT) && !defined(BOOST_STACKTRACE_USE_STD_MODULE) namespace boost { namespace stacktrace { namespace detail { struct mapping_entry_t { - uintptr_t start = 0; - uintptr_t end = 0; - uintptr_t offset_from_base = 0; + std::uintptr_t start = 0; + std::uintptr_t end = 0; + std::uintptr_t offset_from_base = 0; inline bool contains_addr(const void* addr) const { - uintptr_t addr_uint = reinterpret_cast(addr); + std::uintptr_t addr_uint = reinterpret_cast(addr); return addr_uint >= start && addr_uint < end; } }; -inline uintptr_t hex_str_to_int(const std::string& str) { - uintptr_t out; +inline std::uintptr_t hex_str_to_int(const std::string& str) { + std::uintptr_t out; std::stringstream ss; ss << std::hex << str; ss >> out; @@ -70,12 +71,12 @@ inline mapping_entry_t parse_proc_maps_line(const std::string& line) { mapping.end = hex_str_to_int(mapping_end_str); mapping.offset_from_base = hex_str_to_int(offset_from_base_str); return mapping; - } catch(std::invalid_argument& e) { + } catch(const std::invalid_argument& e) { return mapping_entry_t{}; } } -inline uintptr_t get_own_proc_addr_base(const void* addr) { +inline std::uintptr_t get_own_proc_addr_base(const void* addr) { std::ifstream maps_file("/proc/self/maps"); for (std::string line; std::getline(maps_file, line); ) { const mapping_entry_t mapping = parse_proc_maps_line(line); diff --git a/include/boost/stacktrace/detail/frame_msvc.ipp b/include/boost/stacktrace/detail/frame_msvc.ipp index 12f5e09c..b584618a 100644 --- a/include/boost/stacktrace/detail/frame_msvc.ipp +++ b/include/boost/stacktrace/detail/frame_msvc.ipp @@ -262,7 +262,7 @@ public: nullptr, &base )); - + if (res) { name[0] = '\0'; size = 0; @@ -303,7 +303,7 @@ public: } else if (res && size > 1) { module_name->assign(name, size - 1); - } + } } } @@ -402,8 +402,8 @@ public: res += to_hex_array(addr).data(); #else // Get own base address - const uintptr_t base_addr = get_own_proc_addr_base(addr); - res += to_hex_array(reinterpret_cast(addr) - base_addr).data(); + const std::uintptr_t base_addr = get_own_proc_addr_base(addr); + res += to_hex_array(reinterpret_cast(addr) - base_addr).data(); #endif } diff --git a/include/boost/stacktrace/detail/frame_unwind.ipp b/include/boost/stacktrace/detail/frame_unwind.ipp index e8ae68b3..c30c0de2 100644 --- a/include/boost/stacktrace/detail/frame_unwind.ipp +++ b/include/boost/stacktrace/detail/frame_unwind.ipp @@ -50,7 +50,7 @@ public: Base::res = to_hex_array(addr).data(); #else const auto addr_base = boost::stacktrace::detail::get_own_proc_addr_base(addr); - Base::res = to_hex_array(reinterpret_cast(addr) - addr_base).data(); + Base::res = to_hex_array(reinterpret_cast(addr) - addr_base).data(); #endif } diff --git a/include/boost/stacktrace/detail/libbacktrace_impls.hpp b/include/boost/stacktrace/detail/libbacktrace_impls.hpp index 616bd820..23bf7b33 100644 --- a/include/boost/stacktrace/detail/libbacktrace_impls.hpp +++ b/include/boost/stacktrace/detail/libbacktrace_impls.hpp @@ -35,7 +35,7 @@ struct pc_data { std::size_t line; }; -inline void libbacktrace_syminfo_callback(void *data, uintptr_t /*pc*/, const char *symname, uintptr_t /*symval*/, uintptr_t /*symsize*/) { +inline void libbacktrace_syminfo_callback(void *data, std::uintptr_t /*pc*/, const char *symname, std::uintptr_t /*symval*/, std::uintptr_t /*symsize*/) { pc_data& d = *static_cast(data); if (d.function && symname) { *d.function = symname; @@ -43,11 +43,11 @@ inline void libbacktrace_syminfo_callback(void *data, uintptr_t /*pc*/, const ch } // Old versions of libbacktrace have different signature for the callback -inline void libbacktrace_syminfo_callback(void *data, uintptr_t pc, const char *symname, uintptr_t symval) { +inline void libbacktrace_syminfo_callback(void *data, std::uintptr_t pc, const char *symname, std::uintptr_t symval) { boost::stacktrace::detail::libbacktrace_syminfo_callback(data, pc, symname, symval, 0); } -inline int libbacktrace_full_callback(void *data, uintptr_t /*pc*/, const char *filename, int lineno, const char *function) { +inline int libbacktrace_full_callback(void *data, std::uintptr_t /*pc*/, const char *filename, int lineno, const char *function) { pc_data& d = *static_cast(data); if (d.filename && filename) { *d.filename = filename; @@ -129,15 +129,15 @@ struct to_string_using_backtrace { if (state) { ::backtrace_pcinfo( state, - reinterpret_cast(addr), + reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_full_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data - ) + ) || ::backtrace_syminfo( state, - reinterpret_cast(addr), + reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_syminfo_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data @@ -176,7 +176,7 @@ inline std::string name_impl(const void* addr) { if (state) { ::backtrace_pcinfo( state, - reinterpret_cast(addr), + reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_full_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data @@ -184,7 +184,7 @@ inline std::string name_impl(const void* addr) { || ::backtrace_syminfo( state, - reinterpret_cast(addr), + reinterpret_cast(addr), boost::stacktrace::detail::libbacktrace_syminfo_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data @@ -213,7 +213,7 @@ std::string frame::source_file() const { if (state) { ::backtrace_pcinfo( state, - reinterpret_cast(addr_), + reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data @@ -235,7 +235,7 @@ std::size_t frame::source_line() const { if (state) { ::backtrace_pcinfo( state, - reinterpret_cast(addr_), + reinterpret_cast(addr_), boost::stacktrace::detail::libbacktrace_full_callback, boost::stacktrace::detail::libbacktrace_error_callback, &data diff --git a/modules/boost_stacktrace_dump.cppm b/modules/boost_stacktrace_dump.cppm index b1fb6d8d..a812dfc1 100644 --- a/modules/boost_stacktrace_dump.cppm +++ b/modules/boost_stacktrace_dump.cppm @@ -15,13 +15,17 @@ module; #include #if !defined(BOOST_STACKTRACE_USE_STD_MODULE) -#include +#include +#include // std::uintptr_t #endif #include -#include #include +#if !defined(BOOST_WINDOWS) +# include +#endif + #define BOOST_STACKTRACE_INTERFACE_UNIT #define BOOST_STACKTRACE_LINK diff --git a/test/test.cpp b/test/test.cpp index 8333c0d1..c358db2d 100644 --- a/test/test.cpp +++ b/test/test.cpp @@ -85,7 +85,7 @@ void test_nested(bool print = true) { BOOST_TEST(ss1.str().find(" 1# ") != std::string::npos); BOOST_TEST(ss2.str().find(" 1# ") != std::string::npos); - + BOOST_TEST(ss1.str().find(" in ") != std::string::npos); BOOST_TEST(ss2.str().find(" in ") != std::string::npos); @@ -212,7 +212,7 @@ void test_frame() { BOOST_TEST(fv); if (i > 1 && i < min_size - 3) { // Begin ...and end of the trace may match, skipping BOOST_TEST(st[i] != fv); - + #if !(defined(BOOST_STACKTRACE_TEST_NO_DEBUG_AT_ALL) && defined(BOOST_MSVC)) // MSVC can not get function name withhout debug symbols even if it is exported BOOST_TEST(st[i].name() != fv.name()); @@ -276,7 +276,7 @@ std::size_t get_file_size(const char* file_name) { return static_cast(file_size); } -uintptr_t get_address_from_frame(const std::string& frame) { +std::uintptr_t get_address_from_frame(const std::string& frame) { std::size_t address = 0; std::string hex_address; std::size_t pos = frame.find("0x"); @@ -284,7 +284,7 @@ uintptr_t get_address_from_frame(const std::string& frame) { if (pos != std::string::npos) { // Extract the hex address substring hex_address = frame.substr(pos + 2); // Skip "0x" - + // Convert hex string to std::size_t std::stringstream ss; ss << std::hex << hex_address; @@ -295,7 +295,7 @@ uintptr_t get_address_from_frame(const std::string& frame) { } void test_relative_virtual_address(const char* file_path) -{ +{ const auto frame = to_string(boost::stacktrace::stacktrace(0, 1).as_vector().front()); // Skip the test if the frame does not contain an address