diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index 224d6313c..de1ed0517 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -543,6 +543,25 @@ bool CheckUninitVar::checkScopeForVariable(const Token *tok, const Variable& var return true; } + const Token *errorToken = nullptr; + visitAstNodes(tok->next(), + [&](const Token *child) { + if (child->isUnaryOp("&")) + return ChildrenToVisit::none; + if (child->str() == "," || child->str() == "{" || child->isConstOp()) + return ChildrenToVisit::op1_and_op2; + if (child->str() == "." && Token::Match(child->astOperand1(), "%varid", var.declarationId()) && child->astOperand2() && child->astOperand2()->str() == membervar) { + errorToken = child; + return ChildrenToVisit::done; + } + return ChildrenToVisit::none; + }); + + if (errorToken) { + uninitStructMemberError(errorToken->astOperand2(), errorToken->astOperand1()->str() + "." + membervar); + return true; + } + // Skip block tok = end; continue; diff --git a/lib/token.cpp b/lib/token.cpp index 3be98a52a..79590a974 100644 --- a/lib/token.cpp +++ b/lib/token.cpp @@ -1627,7 +1627,7 @@ void Token::printValueFlow(bool xml, std::ostream &out) const break; } if (value.indirect > 0) - for(int i=0;i