From 2b83e79687db5f5048db85d8b475b466246dbaa1 Mon Sep 17 00:00:00 2001 From: firewave Date: Thu, 15 Aug 2024 12:47:30 +0200 Subject: [PATCH 1/2] programmemory.cpp: avoid repeated iteration over values in `Executor::executeImpl()` --- lib/programmemory.cpp | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index 4f96c8f4be3..f23283fcbd8 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -1368,17 +1368,32 @@ namespace { ValueFlow::Value executeImpl(const Token* expr) { - const ValueFlow::Value* value = nullptr; if (!expr) return unknown(); - if (expr->hasKnownIntValue() && !expr->isAssignmentOp() && expr->str() != ",") - return expr->values().front(); - if ((value = expr->getKnownValue(ValueFlow::Value::ValueType::FLOAT)) || - (value = expr->getKnownValue(ValueFlow::Value::ValueType::TOK)) || - (value = expr->getKnownValue(ValueFlow::Value::ValueType::ITERATOR_START)) || - (value = expr->getKnownValue(ValueFlow::Value::ValueType::ITERATOR_END)) || - (value = expr->getKnownValue(ValueFlow::Value::ValueType::CONTAINER_SIZE))) { - return *value; + const ValueFlow::Value* value = nullptr; + for (const auto& val : expr->values()) + { + if (!val.isKnown()) + continue; + switch (val.valueType) { + case ValueFlow::Value::ValueType::INT: { + if (!expr->isAssignmentOp() && expr->str() != ",") + return expr->values().front(); + break; + } + case ValueFlow::Value::ValueType::FLOAT: + case ValueFlow::Value::ValueType::TOK: + case ValueFlow::Value::ValueType::ITERATOR_START: + case ValueFlow::Value::ValueType::ITERATOR_END: + case ValueFlow::Value::ValueType::CONTAINER_SIZE: { + value = &val; + break; + } + default: + break; + } + if (value) + return *value; } if (expr->isNumber()) { if (MathLib::isFloat(expr->str())) From 63380d35d59a94cd9a7ce43f1dc315b80ebe8ac3 Mon Sep 17 00:00:00 2001 From: firewave Date: Sun, 26 Jan 2025 23:20:14 +0100 Subject: [PATCH 2/2] assert --- lib/programmemory.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/programmemory.cpp b/lib/programmemory.cpp index f23283fcbd8..a45cd9f0dce 100644 --- a/lib/programmemory.cpp +++ b/lib/programmemory.cpp @@ -1386,15 +1386,18 @@ namespace { case ValueFlow::Value::ValueType::ITERATOR_START: case ValueFlow::Value::ValueType::ITERATOR_END: case ValueFlow::Value::ValueType::CONTAINER_SIZE: { + assert(!value); value = &val; break; } default: break; } - if (value) - return *value; + //if (value) + // return *value; } + if (value) + return *value; if (expr->isNumber()) { if (MathLib::isFloat(expr->str())) return unknown();