Merge pull request #2715 from rikardfalkeborn/refactor-use-visitastnodes-more
Refactor use visitastnodes more
This commit is contained in:
commit
83be203d44
|
@ -688,16 +688,11 @@ void CheckCondition::multiCondition2()
|
|||
ErrorPath errorPath;
|
||||
|
||||
if (type == MULTICONDITIONTYPE::INNER) {
|
||||
std::stack<const Token *> tokens1;
|
||||
tokens1.push(cond1);
|
||||
while (!tokens1.empty()) {
|
||||
const Token *firstCondition = tokens1.top();
|
||||
tokens1.pop();
|
||||
visitAstNodes(cond1, [&](const Token* firstCondition) {
|
||||
if (!firstCondition)
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (firstCondition->str() == "&&") {
|
||||
tokens1.push(firstCondition->astOperand1());
|
||||
tokens1.push(firstCondition->astOperand2());
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
} else if (!firstCondition->hasKnownIntValue()) {
|
||||
if (!isReturnVar && isOppositeCond(false, mTokenizer->isCPP(), firstCondition, cond2, mSettings->library, true, true, &errorPath)) {
|
||||
if (!isAliased(vars))
|
||||
|
@ -706,7 +701,8 @@ void CheckCondition::multiCondition2()
|
|||
identicalInnerConditionError(firstCondition, cond2, errorPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ChildrenToVisit::none;
|
||||
});
|
||||
} else {
|
||||
visitAstNodes(cond2, [&](const Token *secondCondition) {
|
||||
if (secondCondition->str() == "||" || secondCondition->str() == "&&")
|
||||
|
@ -1436,20 +1432,15 @@ void CheckCondition::alwaysTrueFalse()
|
|||
|
||||
// Don't warn when there are expanded macros..
|
||||
bool isExpandedMacro = false;
|
||||
std::stack<const Token*> tokens;
|
||||
tokens.push(tok);
|
||||
while (!tokens.empty()) {
|
||||
const Token *tok2 = tokens.top();
|
||||
tokens.pop();
|
||||
visitAstNodes(tok, [&](const Token * tok2) {
|
||||
if (!tok2)
|
||||
continue;
|
||||
tokens.push(tok2->astOperand1());
|
||||
tokens.push(tok2->astOperand2());
|
||||
return ChildrenToVisit::none;
|
||||
if (tok2->isExpandedMacro()) {
|
||||
isExpandedMacro = true;
|
||||
break;
|
||||
return ChildrenToVisit::done;
|
||||
}
|
||||
}
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
});
|
||||
if (isExpandedMacro)
|
||||
continue;
|
||||
for (const Token *parent = tok; parent; parent = parent->astParent()) {
|
||||
|
@ -1464,24 +1455,21 @@ void CheckCondition::alwaysTrueFalse()
|
|||
// don't warn when condition checks sizeof result
|
||||
bool hasSizeof = false;
|
||||
bool hasNonNumber = false;
|
||||
tokens.push(tok);
|
||||
while (!tokens.empty()) {
|
||||
const Token *tok2 = tokens.top();
|
||||
tokens.pop();
|
||||
visitAstNodes(tok, [&](const Token * tok2) {
|
||||
if (!tok2)
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (tok2->isNumber())
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (Token::simpleMatch(tok2->previous(), "sizeof (")) {
|
||||
hasSizeof = true;
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
}
|
||||
if (tok2->isComparisonOp() || tok2->isArithmeticalOp()) {
|
||||
tokens.push(tok2->astOperand1());
|
||||
tokens.push(tok2->astOperand2());
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
} else
|
||||
hasNonNumber = true;
|
||||
}
|
||||
return ChildrenToVisit::none;
|
||||
});
|
||||
if (!hasNonNumber && hasSizeof)
|
||||
continue;
|
||||
|
||||
|
|
|
@ -463,27 +463,21 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
|||
VarInfo varInfo1(*varInfo); // VarInfo for if code
|
||||
VarInfo varInfo2(*varInfo); // VarInfo for else code
|
||||
|
||||
// Recursively scan variable comparisons in condition
|
||||
std::stack<const Token *> tokens;
|
||||
// Skip expressions before commas
|
||||
const Token * astOperand2AfterCommas = tok->next()->astOperand2();
|
||||
while (Token::simpleMatch(astOperand2AfterCommas, ","))
|
||||
astOperand2AfterCommas = astOperand2AfterCommas->astOperand2();
|
||||
tokens.push(astOperand2AfterCommas);
|
||||
while (!tokens.empty()) {
|
||||
const Token *tok3 = tokens.top();
|
||||
tokens.pop();
|
||||
|
||||
// Recursively scan variable comparisons in condition
|
||||
visitAstNodes(astOperand2AfterCommas, [&](const Token *tok3) {
|
||||
if (!tok3)
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (tok3->str() == "&&" || tok3->str() == "||") {
|
||||
// FIXME: handle && ! || better
|
||||
tokens.push(tok3->astOperand1());
|
||||
tokens.push(tok3->astOperand2());
|
||||
continue;
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
}
|
||||
if (tok3->str() == "(" && Token::Match(tok3->astOperand1(), "UNLIKELY|LIKELY")) {
|
||||
tokens.push(tok3->astOperand2());
|
||||
continue;
|
||||
return ChildrenToVisit::op2;
|
||||
} else if (tok3->str() == "(" && Token::Match(tok3->previous(), "%name%")) {
|
||||
const std::vector<const Token *> params = getArguments(tok3->previous());
|
||||
for (const Token *par : params) {
|
||||
|
@ -500,7 +494,7 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
|||
varInfo2.erase(vartok->varId());
|
||||
}
|
||||
}
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
}
|
||||
|
||||
const Token *vartok = nullptr;
|
||||
|
@ -517,7 +511,8 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
|||
} else if (astIsVariableComparison(tok3, "==", "-1", &vartok)) {
|
||||
varInfo1.erase(vartok->varId());
|
||||
}
|
||||
}
|
||||
return ChildrenToVisit::none;
|
||||
});
|
||||
|
||||
checkScope(closingParenthesis->next(), &varInfo1, notzero, recursiveCount);
|
||||
closingParenthesis = closingParenthesis->linkAt(1);
|
||||
|
|
|
@ -355,37 +355,32 @@ void CheckString::overlappingStrcmp()
|
|||
continue;
|
||||
std::list<const Token *> equals0;
|
||||
std::list<const Token *> notEquals0;
|
||||
std::stack<const Token *> tokens;
|
||||
tokens.push(tok);
|
||||
while (!tokens.empty()) {
|
||||
const Token * const t = tokens.top();
|
||||
tokens.pop();
|
||||
visitAstNodes(tok, [&](const Token * t) {
|
||||
if (!t)
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (t->str() == "||") {
|
||||
tokens.push(t->astOperand1());
|
||||
tokens.push(t->astOperand2());
|
||||
continue;
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
}
|
||||
if (t->str() == "==") {
|
||||
if (Token::simpleMatch(t->astOperand1(), "(") && Token::simpleMatch(t->astOperand2(), "0"))
|
||||
equals0.push_back(t->astOperand1());
|
||||
else if (Token::simpleMatch(t->astOperand2(), "(") && Token::simpleMatch(t->astOperand1(), "0"))
|
||||
equals0.push_back(t->astOperand2());
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
}
|
||||
if (t->str() == "!=") {
|
||||
if (Token::simpleMatch(t->astOperand1(), "(") && Token::simpleMatch(t->astOperand2(), "0"))
|
||||
notEquals0.push_back(t->astOperand1());
|
||||
else if (Token::simpleMatch(t->astOperand2(), "(") && Token::simpleMatch(t->astOperand1(), "0"))
|
||||
notEquals0.push_back(t->astOperand2());
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
}
|
||||
if (t->str() == "!" && Token::simpleMatch(t->astOperand1(), "("))
|
||||
equals0.push_back(t->astOperand1());
|
||||
else if (t->str() == "(")
|
||||
notEquals0.push_back(t);
|
||||
}
|
||||
return ChildrenToVisit::none;
|
||||
});
|
||||
|
||||
for (const Token *eq0 : equals0) {
|
||||
for (const Token * ne0 : notEquals0) {
|
||||
|
|
|
@ -881,22 +881,17 @@ bool CheckUninitVar::checkLoopBody(const Token *tok, const Variable& var, const
|
|||
usetok = tok;
|
||||
else if (tok->strAt(1) == "=") {
|
||||
bool varIsUsedInRhs = false;
|
||||
std::stack<const Token *> tokens;
|
||||
tokens.push(tok->next()->astOperand2());
|
||||
while (!tokens.empty()) {
|
||||
const Token *t = tokens.top();
|
||||
tokens.pop();
|
||||
visitAstNodes(tok->next()->astOperand2(), [&](const Token * t) {
|
||||
if (!t)
|
||||
continue;
|
||||
return ChildrenToVisit::none;
|
||||
if (t->varId() == var.declarationId()) {
|
||||
varIsUsedInRhs = true;
|
||||
break;
|
||||
return ChildrenToVisit::done;
|
||||
}
|
||||
if (Token::simpleMatch(t->previous(),"sizeof ("))
|
||||
continue;
|
||||
tokens.push(t->astOperand1());
|
||||
tokens.push(t->astOperand2());
|
||||
}
|
||||
return ChildrenToVisit::none;
|
||||
return ChildrenToVisit::op1_and_op2;
|
||||
});
|
||||
if (!varIsUsedInRhs)
|
||||
return true;
|
||||
} else {
|
||||
|
|
Loading…
Reference in New Issue