From a52a4d0844325cbc904e84b27c7fc9d10b2e58c8 Mon Sep 17 00:00:00 2001 From: chrchr-github Date: Mon, 5 Aug 2024 22:32:42 +0200 Subject: [PATCH] Fix --- lib/valueflow.cpp | 5 +++-- test/testvalueflow.cpp | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 93b4536eed6..80ff4dfc4f3 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -7124,13 +7124,14 @@ static void valueFlowContainerSize(const TokenList& tokenlist, } for (const ValueFlow::Value& value : values) setTokenValue(tok, value, settings); - } else if (Token::Match(tok, "%name%|;|{|}|> %var% = ") && Token::Match(tok->tokAt(2)->astOperand2(), "[({]") && settings.library.detectContainer(tok->tokAt(3))) { + } else if (Token::Match(tok, "%name%|;|{|}|> %var% = ") && Token::Match(tok->tokAt(2)->astOperand2(), "[({]") && + (tok->tokAt(3) == tok->tokAt(2)->astOperand2() || settings.library.detectContainer(tok->tokAt(3)))) { Token* containerTok = tok->next(); if (containerTok->exprId() == 0) continue; if (astIsContainer(containerTok) && containerTok->valueType()->container->size_templateArgNo < 0) { Token* rhs = tok->tokAt(2)->astOperand2(); - std::vector values = getContainerSizeFromConstructor(rhs, containerTok->valueType(), settings); + std::vector values = getInitListSize(rhs, containerTok->valueType(), settings); valueFlowContainerSetTokValue(tokenlist, errorLogger, settings, containerTok, rhs); for (const ValueFlow::Value& value : values) valueFlowForward(containerTok->next(), containerTok, value, tokenlist, errorLogger, settings); diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index f1250b87ab8..d0413682724 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -6926,6 +6926,22 @@ class TestValueFlow : public TestFixture { " return x;\n" "}\n"; ASSERT_EQUALS(true, testValueOfXKnown(code, 4U, 1)); + + code = "int f() {\n" + " std::string s;\n" + " s.append(\"0\");\n" + " auto x = s.size();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 5U, 1)); + + code = "int f() {\n" + " std::string s;\n" + " s = std::string(\"0\");\n" + " auto x = s.size();\n" + " return x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfXKnown(code, 5U, 1)); } void valueFlowContainerElement()