@@ -66,13 +66,13 @@ static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsig
6666 * @param library --library files data
6767 * @param checkNullArg perform isnullargbad check for each argument?
6868 */
69- void CheckNullPointer::parseFunctionCall ( const Token &tok, std::list< const Token *> &var , const Library &library, bool checkNullArg)
69+ std::list< const Token*> CheckNullPointer::parseFunctionCall ( const Token &tok , const Library &library, bool checkNullArg)
7070{
7171 if (Token::Match (&tok, " %name% ( )" ) || !tok.tokAt (2 ))
72- return ;
72+ return {} ;
7373
7474 const std::vector<const Token *> args = getArguments (&tok);
75-
75+ std::list< const Token*> var;
7676 for (int argnr = 1 ; argnr <= args.size (); ++argnr) {
7777 const Token *param = args[argnr - 1 ];
7878 if ((!checkNullArg || library.isnullargbad (&tok, argnr)) && checkNullpointerFunctionCallPlausibility (tok.function (), argnr))
@@ -87,14 +87,14 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
8787 if (library.formatstr_function (&tok)) {
8888 const int formatStringArgNr = library.formatstr_argno (&tok);
8989 if (formatStringArgNr < 0 || formatStringArgNr >= args.size ())
90- return ;
90+ return var ;
9191
9292 // 1st parameter..
9393 if (Token::Match (&tok, " snprintf|vsnprintf|fnprintf|vfnprintf" ) && args.size () > 1 && !(args[1 ] && args[1 ]->hasKnownIntValue () && args[1 ]->getKnownIntValue () == 0 )) // Only if length (second parameter) is not zero
9494 var.push_back (args[0 ]);
9595
9696 if (args[formatStringArgNr]->tokType () != Token::eString)
97- return ;
97+ return var ;
9898 const std::string &formatString = args[formatStringArgNr]->strValue ();
9999 int argnr = formatStringArgNr + 1 ;
100100 const bool scan = library.formatstr_scan (&tok);
@@ -116,7 +116,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
116116 }
117117 ++i;
118118 if (i == formatString.end ())
119- return ;
119+ return var ;
120120 }
121121 if (_continue)
122122 continue ;
@@ -129,6 +129,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
129129 }
130130 }
131131 }
132+ return var;
132133}
133134
134135namespace {
@@ -166,8 +167,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set
166167 ftok = ftok->previous ();
167168 }
168169 if (ftok && ftok->previous ()) {
169- std::list<const Token *> varlist;
170- parseFunctionCall (*ftok->previous (), varlist, settings.library , checkNullArg);
170+ const std::list<const Token *> varlist = parseFunctionCall (*ftok->previous (), settings.library , checkNullArg);
171171 if (std::find (varlist.cbegin (), varlist.cend (), tok) != varlist.cend ()) {
172172 return true ;
173173 }
@@ -376,8 +376,7 @@ void CheckNullPointer::nullConstantDereference()
376376 if (var && !var->isPointer () && !var->isArray () && var->isStlStringType ())
377377 nullPointerError (tok);
378378 } else { // function call
379- std::list<const Token *> var;
380- parseFunctionCall (*tok, var, mSettings ->library );
379+ const std::list<const Token *> var = parseFunctionCall (*tok, mSettings ->library );
381380
382381 // is one of the var items a NULL pointer?
383382 for (const Token *vartok : var) {
@@ -456,6 +455,8 @@ void CheckNullPointer::nullPointerError(const Token *tok, const std::string &var
456455 reportError (tok, Severity::warning, " nullPointerOutOfResources" , " Null pointer dereference" , CWE_NULL_POINTER_DEREFERENCE, Certainty::normal);
457456 return ;
458457 }
458+ if (diag (tok))
459+ return ;
459460
460461 if (!value) {
461462 reportError (tok, Severity::error, " nullPointer" , " Null pointer dereference" , CWE_NULL_POINTER_DEREFERENCE, inconclusive ? Certainty::inconclusive : Certainty::normal);
0 commit comments