diff options
-rw-r--r-- | src/testlib/qtestcrashhandler_unix.cpp | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/src/testlib/qtestcrashhandler_unix.cpp b/src/testlib/qtestcrashhandler_unix.cpp index 8a24b96e3dc..9bc0fd2fa9b 100644 --- a/src/testlib/qtestcrashhandler_unix.cpp +++ b/src/testlib/qtestcrashhandler_unix.cpp @@ -184,6 +184,20 @@ std::string_view asyncSafeToString(int n, AsyncSafeIntBuffer &&result = Qt::Unin #endif return std::string_view(result.array.data(), ptr - result.array.data()); }; + +std::string_view asyncSafeToHexString(quintptr u, char *ptr) +{ + // We format with leading zeroes so the output is of fixed length. + // Formatting to shorter is more complex and unnecessary here (unlike + // decimals above). + int shift = sizeof(quintptr) * 8 - 4; + ptr[0] = '0'; + ptr[1] = 'x'; + for (size_t i = 0; i < sizeof(quintptr) * 2; ++i, shift -= 4) + ptr[i + 2] = QtMiscUtils::toHexLower(u >> shift); + + return std::string_view(ptr, sizeof(quintptr) * 2 + 2); +} } // unnamed namespace namespace QTest { @@ -422,15 +436,12 @@ printSentSignalInfo(T *info) template <typename T> static std::enable_if_t<sizeof(std::declval<T>().si_addr) >= 1> printCrashingSignalInfo(T *info) { - using HexString = std::array<char, sizeof(quintptr) * 2>; + using HexString = std::array<char, sizeof(quintptr) * 2 + 2>; auto toHexString = [](quintptr u, HexString &&r = {}) { - int shift = sizeof(quintptr) * 8 - 4; - for (size_t i = 0; i < sizeof(quintptr) * 2; ++i, shift -= 4) - r[i] = QtMiscUtils::toHexLower(u >> shift); - return std::string_view(r.data(), r.size()); + return asyncSafeToHexString(u, r.data()); }; writeToStderr(", code ", asyncSafeToString(info->si_code), - ", for address 0x", toHexString(quintptr(info->si_addr))); + ", for address ", toHexString(quintptr(info->si_addr))); } [[maybe_unused]] static void printCrashingSignalInfo(...) {} |