Skip to content

Commit 8710deb

Browse files
Update checknullpointer.cpp
1 parent a2d9a42 commit 8710deb

1 file changed

Lines changed: 11 additions & 10 deletions

File tree

lib/checknullpointer.cpp

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

134135
namespace {
@@ -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

Comments
 (0)