@@ -1093,7 +1093,7 @@ static bool isVoidCast(const Token *tok)
10931093 return Token::simpleMatch (tok, " (" ) && tok->isCast () && tok->valueType () && tok->valueType ()->type == ValueType::Type::VOID && tok->valueType ()->pointer == 0 ;
10941094}
10951095
1096- const Token* CheckUninitVar::isVariableUsage (const Token *vartok, bool pointer, Alloc alloc, int indirect) const
1096+ const Token* CheckUninitVar::isVariableUsage (bool cpp, const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect)
10971097{
10981098 const Token *valueExpr = vartok; // non-dereferenced , no address of value as variable
10991099 while (Token::Match (valueExpr->astParent (), " .|::" ) && astIsRhs (valueExpr))
@@ -1197,17 +1197,17 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
11971197 parent = parent->astParent ();
11981198 if (Token::simpleMatch (parent, " {" ))
11991199 return valueExpr;
1200- const int use = isFunctionParUsage (valueExpr, pointer, alloc, indirect);
1200+ const int use = isFunctionParUsage (valueExpr, library, pointer, alloc, indirect);
12011201 return (use>0 ) ? valueExpr : nullptr ;
12021202 }
12031203 if (derefValue && Token::Match (derefValue->astParent (), " [(,]" ) && (derefValue->astParent ()->str () == " ," || astIsRhs (derefValue))) {
1204- const int use = isFunctionParUsage (derefValue, false , NO_ALLOC, indirect);
1204+ const int use = isFunctionParUsage (derefValue, library, false , NO_ALLOC, indirect);
12051205 return (use>0 ) ? derefValue : nullptr ;
12061206 }
12071207 if (valueExpr->astParent ()->isUnaryOp (" &" )) {
12081208 const Token *parent = valueExpr->astParent ();
12091209 if (Token::Match (parent->astParent (), " [(,]" ) && (parent->astParent ()->str () == " ," || astIsRhs (parent))) {
1210- const int use = isFunctionParUsage (valueExpr, pointer, alloc, indirect);
1210+ const int use = isFunctionParUsage (valueExpr, library, pointer, alloc, indirect);
12111211 return (use>0 ) ? valueExpr : nullptr ;
12121212 }
12131213 return nullptr ;
@@ -1253,18 +1253,18 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
12531253
12541254 // Stream read/write
12551255 // FIXME this code is a hack!!
1256- if (mTokenizer -> isCPP () && Token::Match (valueExpr->astParent (), " <<|>>" )) {
1257- if (isLikelyStreamRead (mTokenizer -> isCPP () , vartok->previous ()))
1256+ if (cpp && Token::Match (valueExpr->astParent (), " <<|>>" )) {
1257+ if (isLikelyStreamRead (cpp , vartok->previous ()))
12581258 return nullptr ;
12591259
12601260 if (valueExpr->valueType () && valueExpr->valueType ()->type == ValueType::Type::VOID)
12611261 return nullptr ;
12621262 }
1263- if (astIsRhs (derefValue) && isLikelyStreamRead (mTokenizer -> isCPP () , derefValue->astParent ()))
1263+ if (astIsRhs (derefValue) && isLikelyStreamRead (cpp , derefValue->astParent ()))
12641264 return nullptr ;
12651265
12661266 // Assignment with overloaded &
1267- if (mTokenizer -> isCPP () && Token::simpleMatch (valueExpr->astParent (), " &" ) && astIsRhs (valueExpr)) {
1267+ if (cpp && Token::simpleMatch (valueExpr->astParent (), " &" ) && astIsRhs (valueExpr)) {
12681268 const Token *parent = valueExpr->astParent ();
12691269 while (Token::simpleMatch (parent, " &" ) && parent->isBinaryOp ())
12701270 parent = parent->astParent ();
@@ -1280,13 +1280,18 @@ const Token* CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer,
12801280 return derefValue ? derefValue : valueExpr;
12811281}
12821282
1283+ const Token* CheckUninitVar::isVariableUsage (const Token *vartok, bool pointer, Alloc alloc, int indirect) const
1284+ {
1285+ return CheckUninitVar::isVariableUsage (mTokenizer ->isCPP (), vartok, mSettings ->library , pointer, alloc, indirect);
1286+ }
1287+
12831288/* **
12841289 * Is function parameter "used" so a "usage of uninitialized variable" can
12851290 * be written? If parameter is passed "by value" then it is "used". If it
12861291 * is passed "by reference" then it is not necessarily "used".
12871292 * @return -1 => unknown 0 => not used 1 => used
12881293 */
1289- int CheckUninitVar::isFunctionParUsage (const Token *vartok, bool pointer, Alloc alloc, int indirect) const
1294+ int CheckUninitVar::isFunctionParUsage (const Token *vartok, const Library& library, bool pointer, Alloc alloc, int indirect)
12901295{
12911296 bool unknown = false ;
12921297 const Token *parent = getAstParentSkipPossibleCastAndAddressOf (vartok, &unknown);
@@ -1339,11 +1344,11 @@ int CheckUninitVar::isFunctionParUsage(const Token *vartok, bool pointer, Alloc
13391344 // control-flow statement reading the variable "by value"
13401345 return alloc == NO_ALLOC;
13411346 } else {
1342- const bool isnullbad = mSettings -> library .isnullargbad (start->previous (), argumentNumber + 1 );
1347+ const bool isnullbad = library.isnullargbad (start->previous (), argumentNumber + 1 );
13431348 if (indirect == 0 && pointer && !address && isnullbad && alloc == NO_ALLOC)
13441349 return 1 ;
13451350 bool hasIndirect = false ;
1346- const bool isuninitbad = mSettings -> library .isuninitargbad (start->previous (), argumentNumber + 1 , indirect, &hasIndirect);
1351+ const bool isuninitbad = library.isuninitargbad (start->previous (), argumentNumber + 1 , indirect, &hasIndirect);
13471352 if (alloc != NO_ALLOC)
13481353 return (isnullbad || hasIndirect) && isuninitbad;
13491354 return isuninitbad && (!address || isnullbad);
@@ -1354,6 +1359,11 @@ int CheckUninitVar::isFunctionParUsage(const Token *vartok, bool pointer, Alloc
13541359 return -1 ;
13551360}
13561361
1362+ int CheckUninitVar::isFunctionParUsage (const Token *vartok, bool pointer, Alloc alloc, int indirect) const
1363+ {
1364+ return CheckUninitVar::isFunctionParUsage (vartok, mSettings ->library , pointer, alloc, indirect);
1365+ }
1366+
13571367bool CheckUninitVar::isMemberVariableAssignment (const Token *tok, const std::string &membervar) const
13581368{
13591369 if (Token::Match (tok, " %name% . %name%" ) && tok->strAt (2 ) == membervar) {
0 commit comments