From 6b20a9bdd570fb52d8c6a18101965cd733b68c31 Mon Sep 17 00:00:00 2001 From: WerWolv Date: Wed, 12 Jan 2022 08:59:14 +0100 Subject: [PATCH] patterns: Fix local variables holding larger values than allowed --- plugins/libimhex/include/hex/helpers/utils.hpp | 5 +++++ .../libimhex/source/pattern_language/evaluator.cpp | 12 ++++++------ 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/libimhex/include/hex/helpers/utils.hpp b/plugins/libimhex/include/hex/helpers/utils.hpp index 7f8029f11..8a1f9e0f2 100644 --- a/plugins/libimhex/include/hex/helpers/utils.hpp +++ b/plugins/libimhex/include/hex/helpers/utils.hpp @@ -115,6 +115,11 @@ namespace hex { return result; } + [[nodiscard]] + constexpr uint64_t bitmask(uint8_t bits) { + return (uint64_t(1) << (bits)) - 1; + } + template constexpr T changeEndianess(T value, size_t size, std::endian endian) { if (endian == std::endian::native) diff --git a/plugins/libimhex/source/pattern_language/evaluator.cpp b/plugins/libimhex/source/pattern_language/evaluator.cpp index dc5c9cae2..1a2008f91 100644 --- a/plugins/libimhex/source/pattern_language/evaluator.cpp +++ b/plugins/libimhex/source/pattern_language/evaluator.cpp @@ -81,11 +81,11 @@ namespace hex::pl { Token::Literal castedLiteral = std::visit(overloaded { [&](double &value) -> Token::Literal { if (dynamic_cast(pattern)) - return u128(value); + return u128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return s128(value); + return s128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return value; + return pattern->getSize() == sizeof(float) ? double(float(value)) : value; else LogConsole::abortEvaluation(hex::format("cannot cast type 'double' to type '{}'", pattern->getTypeName())); }, @@ -103,15 +103,15 @@ namespace hex::pl { }, [&](auto &&value) -> Token::Literal { if (dynamic_cast(pattern) || dynamic_cast(pattern)) - return u128(value); + return u128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) - return s128(value); + return s128(value) & bitmask(pattern->getSize() * 8); else if (dynamic_cast(pattern)) return char(value); else if (dynamic_cast(pattern)) return bool(value); else if (dynamic_cast(pattern)) - return double(value); + return pattern->getSize() == sizeof(float) ? double(float(value)) : value; else LogConsole::abortEvaluation(hex::format("cannot cast integer literal to type '{}'", pattern->getTypeName())); }