@@ -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