From 3af72077a0b4698cdcfc4d428619b19bff5239c5 Mon Sep 17 00:00:00 2001 From: Marcus Tillmanns Date: Tue, 9 Aug 2022 16:11:22 +0200 Subject: [PATCH] Debugger: Fix crash when showing characters > 0xffff Change-Id: I8eb1492f7ba9fbe846e18e7e93bd8ca57edf177d Reviewed-by: hjk --- src/plugins/debugger/watchhandler.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp index 157835c2607..34114ca77e8 100644 --- a/src/plugins/debugger/watchhandler.cpp +++ b/src/plugins/debugger/watchhandler.cpp @@ -73,6 +73,7 @@ #include #include #include +#include #include #include #include @@ -663,6 +664,15 @@ static QString reformatInteger(quint64 value, int format, int size, bool isSigne // Format printable (char-type) characters static QString reformatCharacter(int code, int size, bool isSigned) { + if (code > 0xffff) { + std::array buf; + memcpy(buf.data(), &code, sizeof(char32_t)); + QByteArrayView view(buf); + const QString encoded = QStringDecoder(QStringDecoder::Utf32)(view); + return QString("'%1'\t%2\t0x%3").arg(encoded).arg(unsigned(code)).arg(uint(code & ((1ULL << (8*size)) - 1)), + 2 * size, 16, QLatin1Char('0')); + } + QChar c; switch (size) { case 1: c = QChar(uchar(code)); break; @@ -694,7 +704,10 @@ static QString reformatCharacter(int code, int size, bool isSigned) else out += QString(2 + 2 * size, ' '); } else { - out += QString::number(unsigned(code)); + if (size == 2) + out += QString::number(char16_t(code)); + else + out += QString::number(unsigned(code)); } out += '\t';