Remove old container forward
This commit is contained in:
parent
71c228a01a
commit
8c7e91c985
|
@ -5705,66 +5705,6 @@ static void valueFlowContainerForward(Token *tok, const Variable* var, ValueFlow
|
||||||
valueFlowContainerForward(tok, endOfVarScope, var, value, tokenlist);
|
valueFlowContainerForward(tok, endOfVarScope, var, value, tokenlist);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void valueFlowContainerForward(Token *tok, nonneg int containerId, ValueFlow::Value value, const Settings *settings, bool cpp)
|
|
||||||
{
|
|
||||||
while (nullptr != (tok = tok->next())) {
|
|
||||||
if (Token::Match(tok, "[{}]"))
|
|
||||||
break;
|
|
||||||
if (Token::Match(tok, "while|for (")) {
|
|
||||||
const Token *start = tok->linkAt(1)->next();
|
|
||||||
if (!Token::simpleMatch(start->link(), "{"))
|
|
||||||
break;
|
|
||||||
if (isContainerSizeChanged(containerId, start, start->link()))
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (Token::simpleMatch(tok, ") {") && Token::Match(tok->link()->previous(), "while|for|if (")) {
|
|
||||||
const Token *start = tok->next();
|
|
||||||
if (isContainerSizeChanged(containerId, start, start->link()) || isEscapeScope(start, nullptr))
|
|
||||||
break;
|
|
||||||
tok = start->link();
|
|
||||||
if (Token::simpleMatch(tok, "} else {")) {
|
|
||||||
start = tok->tokAt(2);
|
|
||||||
if (isContainerSizeChanged(containerId, start, start->link()))
|
|
||||||
break;
|
|
||||||
tok = start->link();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (tok->varId() != containerId)
|
|
||||||
continue;
|
|
||||||
if (Token::Match(tok, "%name% ="))
|
|
||||||
break;
|
|
||||||
if (Token::Match(tok, "%name% +=")) {
|
|
||||||
if (!tok->valueType() || !tok->valueType()->container || !tok->valueType()->container->stdStringLike)
|
|
||||||
break;
|
|
||||||
const Token *rhs = tok->next()->astOperand2();
|
|
||||||
if (rhs->tokType() == Token::eString)
|
|
||||||
value.intvalue += Token::getStrLength(rhs);
|
|
||||||
else if (rhs->valueType() && rhs->valueType()->container && rhs->valueType()->container->stdStringLike) {
|
|
||||||
bool found = false;
|
|
||||||
for (const ValueFlow::Value &rhsval : rhs->values()) {
|
|
||||||
if (rhsval.isKnown() && rhsval.isContainerSizeValue()) {
|
|
||||||
value.intvalue += rhsval.intvalue;
|
|
||||||
found = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
break;
|
|
||||||
} else
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (isLikelyStreamRead(cpp, tok->astParent()))
|
|
||||||
break;
|
|
||||||
if (isContainerSizeChangedByFunction(tok))
|
|
||||||
break;
|
|
||||||
if (!tok->valueType() || !tok->valueType()->container)
|
|
||||||
break;
|
|
||||||
if (Token::Match(tok, "%name% . %name% (") && tok->valueType()->container->getAction(tok->strAt(2)) != Library::Container::Action::NO_ACTION)
|
|
||||||
break;
|
|
||||||
if (!hasContainerSizeGuard(tok, containerId))
|
|
||||||
setTokenValue(tok, value, settings);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool isContainerSizeChanged(const Token *tok, int depth)
|
static bool isContainerSizeChanged(const Token *tok, int depth)
|
||||||
{
|
{
|
||||||
if (!tok)
|
if (!tok)
|
||||||
|
|
Loading…
Reference in New Issue