Skip to content

Commit a04f7b1

Browse files
committed
CheckNullPointer::isPointerDeRef: Refactoring - use tok->variable(). Ticket: danmar#4535
1 parent 1a58ae4 commit a04f7b1

3 files changed

Lines changed: 20 additions & 24 deletions

File tree

lib/checknullpointer.cpp

Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
317317
* @param unknown it is not known if there is a pointer dereference (could be reported as a debug message)
318318
* @return true => there is a dereference
319319
*/
320-
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const SymbolDatabase* symbolDatabase)
320+
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown)
321321
{
322322
const bool inconclusive = unknown;
323323

@@ -350,14 +350,14 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Sym
350350
if (Token::Match(tok->tokAt(-4), "std :: string|wstring ( %var% )"))
351351
return true;
352352
if (Token::Match(tok->tokAt(-2), "%var% ( %var% )")) {
353-
const Variable* var = symbolDatabase->getVariableFromVarId(tok->tokAt(-2)->varId());
353+
const Variable* var = tok->tokAt(-2)->variable();
354354
if (var && !var->isPointer() && !var->isArray() && Token::Match(var->typeStartToken(), "std :: string|wstring !!::"))
355355
return true;
356356
}
357357

358358
// streams dereference nullpointers
359359
if (Token::Match(tok->previous(), "<<|>> %var%")) {
360-
const Variable* var = symbolDatabase->getVariableFromVarId(tok->varId());
360+
const Variable* var = tok->variable();
361361
if (var && var->isPointer() && Token::Match(var->typeStartToken(), "char|wchar_t")) { // Only outputting or reading to char* can cause problems
362362
const Token* tok2 = tok->previous(); // Find start of statement
363363
for (; tok2; tok2 = tok2->previous()) {
@@ -367,25 +367,22 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown, const Sym
367367
if (Token::Match(tok2, "std :: cout|cin|cerr"))
368368
return true;
369369
if (tok2 && tok2->varId() != 0) {
370-
const Variable* var2 = symbolDatabase->getVariableFromVarId(tok2->varId());
370+
const Variable* var2 = tok2->variable();
371371
if (var2 && Token::Match(var2->typeStartToken(), "std :: istream|ifstream|istringstream|wistringstream|ostream|ofstream|ostringstream|wostringstream|stringstream|wstringstream|fstream|iostream"))
372372
return true;
373373
}
374374
}
375375
}
376376

377-
unsigned int ovarid = 0;
377+
const Variable *ovar = NULL;
378378
if (Token::Match(tok, "%var% ==|!= %var%"))
379-
ovarid = tok->tokAt(2)->varId();
379+
ovar = tok->tokAt(2)->variable();
380380
else if (Token::Match(tok->tokAt(-2), "%var% ==|!= %var%"))
381-
ovarid = tok->tokAt(-2)->varId();
381+
ovar = tok->tokAt(-2)->variable();
382382
else if (Token::Match(tok->tokAt(-2), "%var% =|+ %var% )|]|,|;|+"))
383-
ovarid = tok->tokAt(-2)->varId();
384-
if (ovarid) {
385-
const Variable* var = symbolDatabase->getVariableFromVarId(ovarid);
386-
if (var && !var->isPointer() && !var->isArray() && Token::Match(var->typeStartToken(), "std :: string|wstring !!::"))
387-
return true;
388-
}
383+
ovar = tok->tokAt(-2)->variable();
384+
if (ovar && !ovar->isPointer() && !ovar->isArray() && Token::Match(ovar->typeStartToken(), "std :: string|wstring !!::"))
385+
return true;
389386

390387
// Check if it's NOT a pointer dereference.
391388
// This is most useful in inconclusive checking
@@ -875,7 +872,7 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
875872
break;
876873
} else if (Token::Match(tok1->tokAt(-2), "&&|%oror% !")) {
877874
break;
878-
} else if (CheckNullPointer::isPointerDeRef(tok1, unknown, symbolDatabase)) {
875+
} else if (CheckNullPointer::isPointerDeRef(tok1, unknown)) {
879876
nullPointerError(tok1, varname, tok, inconclusive);
880877
break;
881878
} else if (tok1->strAt(-1) == "&") {
@@ -963,7 +960,7 @@ void CheckNullPointer::nullPointerByCheckAndDeRef()
963960

964961
// Pointer is used
965962
bool unknown = _settings->inconclusive;
966-
if (tok2->varId() == varid && (isPointerDeRef(tok2, unknown, symbolDatabase) || unknown)) {
963+
if (tok2->varId() == varid && (isPointerDeRef(tok2, unknown) || unknown)) {
967964
nullPointerError(tok2, pointerName, vartok, unknown);
968965
break;
969966
}
@@ -1020,7 +1017,7 @@ void CheckNullPointer::nullPointerByCheckAndDeRef()
10201017
bool unknown = _settings->inconclusive;
10211018
for (; tok2 && tok2->str() != ";"; tok2 = tok2->next()) {
10221019
if (tok2->varId() == varid) {
1023-
if (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase))
1020+
if (CheckNullPointer::isPointerDeRef(tok2, unknown))
10241021
nullPointerError(tok2, pointerName, vartok, inconclusive);
10251022
else if (unknown)
10261023
nullPointerError(tok2, pointerName, vartok, true);
@@ -1090,7 +1087,7 @@ void CheckNullPointer::nullPointerByCheckAndDeRef()
10901087
if (Token::Match(tok2->previous(), "[;{}=] %var% = 0 ;"))
10911088
;
10921089

1093-
else if (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase))
1090+
else if (CheckNullPointer::isPointerDeRef(tok2, unknown))
10941091
nullPointerError(tok2, pointerName, vartok, inconclusive);
10951092

10961093
else if (unknown && _settings->inconclusive)
@@ -1251,7 +1248,7 @@ void CheckNullPointer::nullPointerDefaultArgument()
12511248
if (Token::Match(tok, "%var% ="))
12521249
pointerArgs.erase(tok->varId());
12531250

1254-
if (isPointerDeRef(tok, unknown, symbolDatabase))
1251+
if (isPointerDeRef(tok, unknown))
12551252
nullPointerDefaultArgError(tok, tok->str());
12561253
}
12571254
}
@@ -1380,7 +1377,7 @@ class Nullpointer : public ExecutionPath {
13801377
// unknown: if isPointerDeRef fails to determine if there
13811378
// is a dereference this will be set to true.
13821379
bool unknown = owner->inconclusiveFlag();
1383-
bool deref = CheckNullPointer::isPointerDeRef(&tok, unknown, symbolDatabase);
1380+
bool deref = CheckNullPointer::isPointerDeRef(&tok, unknown);
13841381

13851382
if (deref)
13861383
dereference(checks, &tok);
@@ -1407,7 +1404,7 @@ class Nullpointer : public ExecutionPath {
14071404
const Token* tok2 = &tok;
14081405
for (; tok2 && tok2->str() != ";"; tok2 = tok2->next()) {
14091406
if (tok2->varId()) {
1410-
if (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase) || unknown)
1407+
if (CheckNullPointer::isPointerDeRef(tok2, unknown) || unknown)
14111408
dereference(checks, tok2);
14121409
}
14131410

@@ -1430,7 +1427,7 @@ class Nullpointer : public ExecutionPath {
14301427
if (tok2->str() == "(" || tok2->str() == ")" || tok2->str() == "&&" || tok2->str() == "||" || tok2->str() == "?")
14311428
break;
14321429
bool unknown = owner->inconclusiveFlag();
1433-
if (tok2->varId() && (CheckNullPointer::isPointerDeRef(tok2, unknown, symbolDatabase) || unknown))
1430+
if (tok2->varId() && (CheckNullPointer::isPointerDeRef(tok2, unknown) || unknown))
14341431
dereference(checks, tok2);
14351432
}
14361433

lib/checknullpointer.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,9 @@ class CPPCHECKLIB CheckNullPointer : public Check {
7777
* is returned.
7878
* @param tok token for the pointer
7979
* @param unknown it is not known if there is a pointer dereference (could be reported as a debug message)
80-
* @param symbolDatabase symbol database
8180
* @return true => there is a dereference
8281
*/
83-
static bool isPointerDeRef(const Token *tok, bool &unknown, const SymbolDatabase* symbolDatabase);
82+
static bool isPointerDeRef(const Token *tok, bool &unknown);
8483

8584
/** @brief possible null pointer dereference */
8685
void nullPointer();

lib/checkuninitvar.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1544,7 +1544,7 @@ bool CheckUninitVar::isVariableUsage(const Token *vartok, bool pointer) const
15441544
}
15451545

15461546
bool unknown = false;
1547-
if (pointer && CheckNullPointer::isPointerDeRef(vartok, unknown, _tokenizer->getSymbolDatabase())) {
1547+
if (pointer && CheckNullPointer::isPointerDeRef(vartok, unknown)) {
15481548
// function parameter?
15491549
bool functionParameter = false;
15501550
if (Token::Match(vartok->tokAt(-2), "%var% (") || vartok->previous()->str() == ",")

0 commit comments

Comments
 (0)