From 1330a0639d2496db0a65ed43b52a8c99bff9ed92 Mon Sep 17 00:00:00 2001 From: Robin Getz Date: Sat, 1 Aug 2026 15:10:48 -0400 Subject: [PATCH] Fix undefined left shift in SimpleDeserializer::readS64 The signed 64-bit deserialization code used a signed temporary value while assembling bytes: tmp = (tmp << 8) | byte; For negative values, tmp was initialized to -1 for sign extension. Left-shifting this negative value is undefined behavior in C++. Use an unsigned temporary while constructing the 64-bit representation and convert to qint64 after all bytes have been assembled. This preserves the existing two's complement sign handling while avoiding undefined behavior. Fixes static analysis warning about shifting a negative value. Signed-off-by: Robin Getz --- sdrbase/util/simpleserializer.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/sdrbase/util/simpleserializer.cpp b/sdrbase/util/simpleserializer.cpp index 822e74382..0ced52faa 100644 --- a/sdrbase/util/simpleserializer.cpp +++ b/sdrbase/util/simpleserializer.cpp @@ -392,7 +392,7 @@ returnDefault: bool SimpleDeserializer::readS64(quint32 id, qint64* result, qint64 def) const { uint readOfs; - qint64 tmp; + quint64 tmp; Elements::const_iterator it = m_elements.constFind(id); if(it == m_elements.constEnd()) goto returnDefault; @@ -406,10 +406,10 @@ bool SimpleDeserializer::readS64(quint32 id, qint64* result, qint64 def) const for(uint i = 0; i < it->length; i++) { quint8 byte = readByte(&readOfs); if((i == 0) && (byte & 0x80)) - tmp = -1; + tmp = 0xFFFFFFFFFFFFFFFFULL; tmp = (tmp << 8) | byte; } - *result = tmp; + *result = static_cast(tmp); return true; returnDefault: