diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 230d292f5..6556ff204 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -3494,6 +3494,21 @@ static void valueFlowContainerForward(const Token *tok, unsigned int containerId static void valueFlowContainerSize(TokenList *tokenlist, SymbolDatabase* symboldatabase, ErrorLogger * /*errorLogger*/, const Settings *settings) { + // declaration + for (const Variable *var : symboldatabase->variableList()) { + if (!var || !var->isLocal() || var->isPointer() || var->isReference()) + continue; + if (!var->valueType() || !var->valueType()->container) + continue; + if (!Token::Match(var->nameToken(), "%name% ;")) + continue; + ValueFlow::Value value(0); + value.valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE; + value.setKnown(); + valueFlowContainerForward(var->nameToken()->next(), var->declarationId(), value, settings); + } + + // conditional conditionSize for (const Scope &scope : symboldatabase->scopeList) { if (scope.type != Scope::ScopeType::eIf) // TODO: while continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 9ac32f26f..f2b361cfb 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -3325,6 +3325,12 @@ private: " if (!v.empty() && v[10]==0) {}\n" // <- no container size for 'v[10]' "}"; ASSERT(tokenValues(code, "v [").empty()); + + code = "void f() {\n" + " std::list ints;\n" + " ints.front();\n" + "}"; + ASSERT_EQUALS("", isKnownContainerSizeValue(tokenValues(code, "ints . front"), 0)); } };