@@ -7094,6 +7094,20 @@ static void valueFlowContainerSize(const TokenList& tokenlist,
70947094 }
70957095 }
70967096
7097+ auto forwardMinimumContainerSize = [&](MathLib::bigint size, Token* opTok, const Token* exprTok) -> void {
7098+ if (size == 0 )
7099+ return ;
7100+
7101+ ValueFlow::Value value (size - 1 );
7102+ value.valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE;
7103+ value.bound = ValueFlow::Value::Bound::Upper;
7104+ value.setImpossible ();
7105+ Token* next = nextAfterAstRightmostLeaf (opTok);
7106+ if (!next)
7107+ next = opTok->next ();
7108+ valueFlowForward (next, exprTok, std::move (value), tokenlist, errorLogger, settings);
7109+ };
7110+
70977111 // after assignment
70987112 for (const Scope *functionScope : symboldatabase.functionScopes ) {
70997113 for (auto * tok = const_cast <Token*>(functionScope->bodyStart ); tok != functionScope->bodyEnd ; tok = tok->next ()) {
@@ -7161,20 +7175,22 @@ static void valueFlowContainerSize(const TokenList& tokenlist,
71617175 value.setImpossible ();
71627176 valueFlowForward (tok->linkAt (2 ), containerTok, std::move (value), tokenlist, errorLogger, settings);
71637177 }
7164- } else if (Token::simpleMatch (tok, " +=" ) && astIsContainer (tok->astOperand1 ())) {
7178+
7179+ } else if (tok->str () == " +=" && astIsContainer (tok->astOperand1 ())) {
71657180 const Token* containerTok = tok->astOperand1 ();
71667181 const Token* valueTok = tok->astOperand2 ();
7167- MathLib::bigint size = valueFlowGetStrLength (valueTok);
7168- if (size == 0 )
7169- continue ;
7170- ValueFlow::Value value (size - 1 );
7171- value.valueType = ValueFlow::Value::ValueType::CONTAINER_SIZE;
7172- value.bound = ValueFlow::Value::Bound::Upper;
7173- value.setImpossible ();
7174- Token* next = nextAfterAstRightmostLeaf (tok);
7175- if (!next)
7176- next = tok->next ();
7177- valueFlowForward (next, containerTok, std::move (value), tokenlist, errorLogger, settings);
7182+ const MathLib::bigint size = valueFlowGetStrLength (valueTok);
7183+ forwardMinimumContainerSize (size, tok, containerTok);
7184+
7185+ } else if (tok->str () == " =" && Token::simpleMatch (tok->astOperand2 (), " +" ) && astIsContainerString (tok)) {
7186+ const Token* tok2 = tok->astOperand2 ();
7187+ MathLib::bigint size = 0 ;
7188+ while (Token::simpleMatch (tok2, " +" ) && tok2->astOperand2 ()) {
7189+ size += valueFlowGetStrLength (tok2->astOperand2 ());
7190+ tok2 = tok2->astOperand1 ();
7191+ }
7192+ size += valueFlowGetStrLength (tok2);
7193+ forwardMinimumContainerSize (size, tok, tok->astOperand1 ());
71787194 }
71797195 }
71807196 }
0 commit comments