Skip to content

Commit 90e6626

Browse files
Update checkleakautovar.cpp
1 parent 1a7259a commit 90e6626

1 file changed

Lines changed: 52 additions & 43 deletions

File tree

lib/checkleakautovar.cpp

Lines changed: 52 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -578,53 +578,62 @@ bool CheckLeakAutoVar::checkScope(const Token * const startToken,
578578
astOperand2AfterCommas = astOperand2AfterCommas->astOperand2();
579579

580580
// Recursively scan variable comparisons in condition
581-
visitAstNodes(astOperand2AfterCommas, [&](const Token *tok3) {
582-
if (!tok3)
583-
return ChildrenToVisit::none;
584-
if (tok3->str() == "&&" || tok3->str() == "||") {
585-
// FIXME: handle && ! || better
586-
return ChildrenToVisit::op1_and_op2;
587-
}
588-
if (tok3->str() == "(" && Token::Match(tok3->astOperand1(), "UNLIKELY|LIKELY")) {
589-
return ChildrenToVisit::op2;
590-
}
591-
if (tok3->str() == "(" && tok3->previous()->isName()) {
592-
const std::vector<const Token *> params = getArguments(tok3->previous());
593-
for (const Token *par : params) {
594-
if (!par->isComparisonOp())
595-
continue;
596-
const Token *vartok = nullptr;
597-
if (isVarTokComparison(par, &vartok, alloc_success_conds) ||
598-
(isVarTokComparison(par, &vartok, alloc_failed_conds))) {
599-
varInfo1.erase(vartok->varId());
600-
varInfo2.erase(vartok->varId());
581+
const Token* compToks[] = {
582+
astOperand2AfterCommas,
583+
astOperand2AfterCommas->hasKnownValue(ValueFlow::Value::ValueType::SYMBOLIC) ? astOperand2AfterCommas->getKnownValue(ValueFlow::Value::ValueType::SYMBOLIC)->tokvalue : nullptr
584+
};
585+
for (auto compTok : compToks) {
586+
if (!compTok)
587+
continue;
588+
visitAstNodes(compTok, [&](const Token* tok3) {
589+
if (!tok3)
590+
return ChildrenToVisit::none;
591+
if (tok3->str() == "&&" || tok3->str() == "||") {
592+
// FIXME: handle && ! || better
593+
return ChildrenToVisit::op1_and_op2;
594+
}
595+
if (tok3->str() == "(" && Token::Match(tok3->astOperand1(), "UNLIKELY|LIKELY")) {
596+
return ChildrenToVisit::op2;
597+
}
598+
if (tok3->str() == "(" && tok3->previous()->isName()) {
599+
const std::vector<const Token*> params = getArguments(tok3->previous());
600+
for (const Token* par : params) {
601+
if (!par->isComparisonOp())
602+
continue;
603+
const Token* vartok = nullptr;
604+
if (isVarTokComparison(par, &vartok, alloc_success_conds) ||
605+
(isVarTokComparison(par, &vartok, alloc_failed_conds))) {
606+
varInfo1.erase(vartok->varId());
607+
varInfo2.erase(vartok->varId());
608+
}
601609
}
610+
return ChildrenToVisit::none;
602611
}
603-
return ChildrenToVisit::none;
604-
}
605612

606-
const Token *vartok = nullptr;
607-
if (isVarTokComparison(tok3, &vartok, alloc_success_conds)) {
608-
varInfo2.reallocToAlloc(vartok->varId());
609-
varInfo2.erase(vartok->varId());
610-
if (astIsVariableComparison(tok3, "!=", "0", &vartok) &&
611-
(notzero.find(vartok->varId()) != notzero.end()))
612-
varInfo2.clear();
613-
614-
if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair<int, VarInfo::AllocInfo>& info) {
615-
if (info.second.status != VarInfo::ALLOC)
616-
return false;
617-
const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, *mSettings);
618-
return ret && vartok && ret->varId() && ret->varId() == vartok->varId();
619-
})) {
620-
varInfo1.clear();
613+
const Token* vartok = nullptr;
614+
if (isVarTokComparison(tok3, &vartok, alloc_success_conds)) {
615+
varInfo2.reallocToAlloc(vartok->varId());
616+
varInfo2.erase(vartok->varId());
617+
if (astIsVariableComparison(tok3, "!=", "0", &vartok) &&
618+
(notzero.find(vartok->varId()) != notzero.end()))
619+
varInfo2.clear();
620+
621+
if (std::any_of(varInfo1.alloctype.begin(), varInfo1.alloctype.end(), [&](const std::pair<int, VarInfo::AllocInfo>& info) {
622+
if (info.second.status != VarInfo::ALLOC)
623+
return false;
624+
const Token* ret = getReturnValueFromOutparamAlloc(info.second.allocTok, *mSettings);
625+
return ret && vartok && ret->varId() && ret->varId() == vartok->varId();
626+
})) {
627+
varInfo1.clear();
628+
}
621629
}
622-
} else if (isVarTokComparison(tok3, &vartok, alloc_failed_conds)) {
623-
varInfo1.reallocToAlloc(vartok->varId());
624-
varInfo1.erase(vartok->varId());
625-
}
626-
return ChildrenToVisit::none;
627-
});
630+
else if (isVarTokComparison(tok3, &vartok, alloc_failed_conds)) {
631+
varInfo1.reallocToAlloc(vartok->varId());
632+
varInfo1.erase(vartok->varId());
633+
}
634+
return ChildrenToVisit::none;
635+
});
636+
}
628637

629638
if (!skipIfBlock && !checkScope(closingParenthesis->next(), varInfo1, notzero, recursiveCount)) {
630639
varInfo.clear();

0 commit comments

Comments
 (0)