From 2b10e38eec32220933423c849f5247f181291c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Fri, 10 Aug 2018 21:42:13 +0200 Subject: [PATCH] valueFlowContainerSize: handling of 'v.size() == 10' --- lib/valueflow.cpp | 10 ++++++++-- test/testvalueflow.cpp | 10 ++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 32582c6b0..aa9cc1ba8 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3460,21 +3460,27 @@ static void valueFlowContainerSize(TokenList * /*tokenlist*/, SymbolDatabase* sy continue; const Token *conditionToken; + MathLib::bigint intval; if (tok->valueType()->container->getYield(tok->strAt(2)) == Library::Container::Yield::SIZE) { const Token *parent = tok->tokAt(3)->astParent(); if (!parent || !parent->isComparisonOp() || !parent->astOperand2()) continue; - if (parent->astOperand1()->str() != "0" && parent->astOperand2()->str() != "0") + if (parent->astOperand1()->hasKnownIntValue()) + intval = parent->astOperand1()->values().front().intvalue; + else if (parent->astOperand2()->hasKnownIntValue()) + intval = parent->astOperand2()->values().front().intvalue; + else continue; conditionToken = parent; } else if (tok->valueType()->container->getYield(tok->strAt(2)) == Library::Container::Yield::EMPTY) { conditionToken = tok->tokAt(3); + intval = 0; } else { continue; } - ValueFlow::Value value(conditionToken, 0LL); + ValueFlow::Value value(conditionToken, intval); value.valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE; valueFlowContainerReverse(scope.classDef, tok->varId(), value, settings); } diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 7b23bc7e9..75cc65388 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3277,6 +3277,16 @@ private: "}"; values = tokenValues(code, "ints . front"); ASSERT_EQUALS(true, values.empty()); + + code = "void f(std::vector v) {\n" + " v[10] = 0;\n" + " if (v.size() == 10) {}\n" + "}"; + values = tokenValues(code, "v ["); + ASSERT_EQUALS(1, values.size()); + ASSERT_EQUALS(true, values.empty() ? true : values.front().isContainerSizeValue()); + ASSERT_EQUALS(10, values.empty() ? 10 : values.front().intvalue); + } };