@@ -686,11 +686,19 @@ void CheckStl::sameIteratorExpressionError(const Token *tok)
686686 reportError (tok, Severity::style, " sameIteratorExpression" , " Same iterators expression are used for algorithm." , CWE664, Certainty::normal);
687687}
688688
689- static const Token* getAddressContainer (const Token* tok)
689+ static std::vector< const Token*> getAddressContainer (const Token* tok)
690690{
691691 if (Token::simpleMatch (tok, " [" ) && tok->astOperand1 ())
692- return tok->astOperand1 ();
693- return tok;
692+ return { tok->astOperand1 () };
693+ std::vector<ValueFlow::Value> values = ValueFlow::getLifetimeObjValues (tok, /* inconclusive*/ false );
694+ std::vector<const Token*> res;
695+ for (const auto & v : values) {
696+ if (v.tokvalue )
697+ res.emplace_back (v.tokvalue );
698+ }
699+ if (res.empty ())
700+ res.emplace_back (tok);
701+ return res;
694702}
695703
696704static bool isSameIteratorContainerExpression (const Token* tok1,
@@ -701,10 +709,18 @@ static bool isSameIteratorContainerExpression(const Token* tok1,
701709 if (isSameExpression (true , false , tok1, tok2, library, false , false )) {
702710 return !astIsContainerOwned (tok1) || !isTemporary (true , tok1, &library);
703711 }
704- if (kind == ValueFlow::Value::LifetimeKind::Address) {
705- return isSameExpression (true , false , getAddressContainer (tok1), getAddressContainer (tok2), library, false , false );
712+ if (astContainerYield (tok2) == Library::Container::Yield::ITEM)
713+ return true ;
714+ if (kind == ValueFlow::Value::LifetimeKind::Address || kind == ValueFlow::Value::LifetimeKind::Iterator) {
715+ const auto address1 = getAddressContainer (tok1);
716+ const auto address2 = getAddressContainer (tok2);
717+ return std::any_of (address1.begin (), address1.end (), [&](const Token* tok1) {
718+ return std::any_of (address2.begin (), address2.end (), [&](const Token* tok2) {
719+ return isSameExpression (true , false , tok1, tok2, library, false , false );
720+ });
721+ });
706722 }
707- return astContainerYield (tok2) == Library::Container::Yield::ITEM ;
723+ return false ;
708724}
709725
710726static ValueFlow::Value getLifetimeIteratorValue (const Token* tok, MathLib::bigint path = 0 )
@@ -866,6 +882,8 @@ void CheckStl::mismatchingContainerIterator()
866882 ValueFlow::Value val = getLifetimeIteratorValue (iterTok);
867883 if (!val.tokvalue )
868884 continue ;
885+ if (!val.isKnown () && Token::simpleMatch (val.tokvalue ->astParent (), " :" ))
886+ continue ;
869887 if (val.lifetimeKind != ValueFlow::Value::LifetimeKind::Iterator)
870888 continue ;
871889 if (iterTok->str () == " *" && iterTok->astOperand1 ()->valueType () && iterTok->astOperand1 ()->valueType ()->type == ValueType::ITERATOR)
0 commit comments