@@ -59,20 +59,13 @@ static bool checkNullpointerFunctionCallPlausibility(const Function* func, unsig
5959 return !func || (func->argCount () >= arg && func->getArgumentVar (arg - 1 ) && func->getArgumentVar (arg - 1 )->isPointer ());
6060}
6161
62- /* *
63- * @brief parse a function call and extract information about variable usage
64- * @param tok first token
65- * @param var variables that the function read / write.
66- * @param library --library files data
67- * @param checkNullArg perform isnullargbad check for each argument?
68- */
69- void CheckNullPointer::parseFunctionCall (const Token &tok, std::list<const Token *> &var, const Library &library, bool checkNullArg)
62+ std::list<const Token*> CheckNullPointer::parseFunctionCall (const Token &tok, const Library &library, bool checkNullArg)
7063{
7164 if (Token::Match (&tok, " %name% ( )" ) || !tok.tokAt (2 ))
72- return ;
65+ return {} ;
7366
7467 const std::vector<const Token *> args = getArguments (&tok);
75-
68+ std::list< const Token*> var;
7669 for (int argnr = 1 ; argnr <= args.size (); ++argnr) {
7770 const Token *param = args[argnr - 1 ];
7871 if ((!checkNullArg || library.isnullargbad (&tok, argnr)) && checkNullpointerFunctionCallPlausibility (tok.function (), argnr))
@@ -87,14 +80,14 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
8780 if (library.formatstr_function (&tok)) {
8881 const int formatStringArgNr = library.formatstr_argno (&tok);
8982 if (formatStringArgNr < 0 || formatStringArgNr >= args.size ())
90- return ;
83+ return var ;
9184
9285 // 1st parameter..
9386 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
9487 var.push_back (args[0 ]);
9588
9689 if (args[formatStringArgNr]->tokType () != Token::eString)
97- return ;
90+ return var ;
9891 const std::string &formatString = args[formatStringArgNr]->strValue ();
9992 int argnr = formatStringArgNr + 1 ;
10093 const bool scan = library.formatstr_scan (&tok);
@@ -116,7 +109,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
116109 }
117110 ++i;
118111 if (i == formatString.end ())
119- return ;
112+ return var ;
120113 }
121114 if (_continue)
122115 continue ;
@@ -129,6 +122,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
129122 }
130123 }
131124 }
125+ return var;
132126}
133127
134128namespace {
@@ -166,8 +160,7 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Set
166160 ftok = ftok->previous ();
167161 }
168162 if (ftok && ftok->previous ()) {
169- std::list<const Token *> varlist;
170- parseFunctionCall (*ftok->previous (), varlist, settings.library , checkNullArg);
163+ const std::list<const Token *> varlist = parseFunctionCall (*ftok->previous (), settings.library , checkNullArg);
171164 if (std::find (varlist.cbegin (), varlist.cend (), tok) != varlist.cend ()) {
172165 return true ;
173166 }
@@ -376,8 +369,7 @@ void CheckNullPointer::nullConstantDereference()
376369 if (var && !var->isPointer () && !var->isArray () && var->isStlStringType ())
377370 nullPointerError (tok);
378371 } else { // function call
379- std::list<const Token *> var;
380- parseFunctionCall (*tok, var, mSettings ->library );
372+ const std::list<const Token *> var = parseFunctionCall (*tok, mSettings ->library );
381373
382374 // is one of the var items a NULL pointer?
383375 for (const Token *vartok : var) {
@@ -456,6 +448,8 @@ void CheckNullPointer::nullPointerError(const Token *tok, const std::string &var
456448 reportError (tok, Severity::warning, " nullPointerOutOfResources" , " Null pointer dereference" , CWE_NULL_POINTER_DEREFERENCE, Certainty::normal);
457449 return ;
458450 }
451+ if (diag (tok))
452+ return ;
459453
460454 if (!value) {
461455 reportError (tok, Severity::error, " nullPointer" , " Null pointer dereference" , CWE_NULL_POINTER_DEREFERENCE, inconclusive ? Certainty::inconclusive : Certainty::normal);
0 commit comments