@@ -1284,56 +1284,26 @@ std::string CheckUninitVar::MyFileInfo::toString() const
12841284 return CTU::toString (unsafeUsage);
12851285}
12861286
1287- bool CheckUninitVar::isUnsafeFunction (const Scope *scope, int argnr, const Token **tok) const
1288- {
1289- const Variable * const argvar = scope->function ->getArgumentVar (argnr);
1290- if (!argvar->isPointer ())
1291- return false ;
1292- for (const Token *tok2 = scope->bodyStart ; tok2 != scope->bodyEnd ; tok2 = tok2->next ()) {
1293- if (Token::simpleMatch (tok2, " ) {" )) {
1294- tok2 = tok2->linkAt (1 );
1295- if (Token::findmatch (tok2->link (), " return|throw" , tok2))
1296- return false ;
1297- if (isVariableChanged (tok2->link (), tok2, argvar->declarationId (), false , mSettings , mTokenizer ->isCPP ()))
1298- return false ;
1299- }
1300- if (tok2->variable () != argvar)
1301- continue ;
1302- if (!isVariableUsage (tok2, true , Alloc::ARRAY ))
1303- return false ;
1304- *tok = tok2;
1305- return true ;
1306- }
1307- return false ;
1308- }
1309-
1310-
13111287Check::FileInfo *CheckUninitVar::getFileInfo (const Tokenizer *tokenizer, const Settings *settings) const
13121288{
13131289 const CheckUninitVar checker (tokenizer, settings, nullptr );
13141290 return checker.getFileInfo ();
13151291}
13161292
1293+ static bool isVariableUsage (const Check *check, const Token *vartok)
1294+ {
1295+ const CheckUninitVar *c = dynamic_cast <const CheckUninitVar *>(check);
1296+ return c && c->isVariableUsage (vartok, true , CheckUninitVar::Alloc::ARRAY );
1297+ }
1298+
13171299Check::FileInfo *CheckUninitVar::getFileInfo () const
13181300{
1319- const SymbolDatabase * const symbolDatabase = mTokenizer ->getSymbolDatabase ();
1301+ const std::list<CTU ::FileInfo::UnsafeUsage> &unsafeUsage = CTU::getUnsafeUsage (mTokenizer , mSettings , this , ::isVariableUsage);
1302+ if (unsafeUsage.empty ())
1303+ return nullptr ;
13201304
13211305 MyFileInfo *fileInfo = new MyFileInfo;
1322-
1323- // Parse all functions in TU
1324- for (const Scope &scope : symbolDatabase->scopeList ) {
1325- if (!scope.isExecutable () || scope.type != Scope::eFunction || !scope.function )
1326- continue ;
1327- const Function *const function = scope.function ;
1328-
1329- // "Unsafe" functions unconditionally reads data before it is written..
1330- for (int argnr = 0 ; argnr < function->argCount (); ++argnr) {
1331- const Token *tok;
1332- if (isUnsafeFunction (&scope, argnr, &tok))
1333- fileInfo->unsafeUsage .push_back (CTU::FileInfo::UnsafeUsage (CTU::getFunctionId (mTokenizer , function), argnr+1 , tok->str (), CTU::FileInfo::Location (mTokenizer ,tok)));
1334- }
1335- }
1336-
1306+ fileInfo->unsafeUsage = unsafeUsage ;
13371307 return fileInfo;
13381308}
13391309
0 commit comments