CheckNullPointer::isPointerDeRef: Skip inconclusive checking when --inconclusive hasn't been given.
This commit is contained in:
parent
99d8ce3732
commit
2dbe7ca196
|
@ -218,6 +218,8 @@ void CheckNullPointer::parseFunctionCall(const Token &tok, std::list<const Token
|
||||||
*/
|
*/
|
||||||
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown)
|
bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown)
|
||||||
{
|
{
|
||||||
|
const bool inconclusive = unknown;
|
||||||
|
|
||||||
unknown = false;
|
unknown = false;
|
||||||
|
|
||||||
// Dereferencing pointer..
|
// Dereferencing pointer..
|
||||||
|
@ -246,25 +248,29 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown)
|
||||||
tok->varId() == tok->tokAt(2)->varId())
|
tok->varId() == tok->tokAt(2)->varId())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// Not a dereference..
|
// Check if it's NOT a pointer dereference.
|
||||||
if (Token::Match(tok->previous(), "[;{}] %var% ="))
|
// This is most useful in inconclusive checking
|
||||||
return false;
|
if (inconclusive) {
|
||||||
|
// Not a dereference..
|
||||||
|
if (Token::Match(tok->previous(), "[;{}] %var% ="))
|
||||||
|
return false;
|
||||||
|
|
||||||
// OK to delete a null
|
// OK to delete a null
|
||||||
if (Token::Match(tok->previous(), "delete %var%") || Token::Match(tok->tokAt(-3), "delete [ ] %var%"))
|
if (Token::Match(tok->previous(), "delete %var%") || Token::Match(tok->tokAt(-3), "delete [ ] %var%"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// OK to check if pointer is null
|
// OK to check if pointer is null
|
||||||
// OK to take address of pointer
|
// OK to take address of pointer
|
||||||
if (Token::Match(tok->previous(), "!|& %var% )|,|&&|%oror%"))
|
if (Token::Match(tok->previous(), "!|& %var% )|,|&&|%oror%"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// OK to pass pointer to function
|
// OK to pass pointer to function
|
||||||
if (Token::Match(tok->previous(), ", %var% [,)]"))
|
if (Token::Match(tok->previous(), ", %var% [,)]"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
// unknown if it's a dereference
|
// unknown if it's a dereference
|
||||||
unknown = true;
|
unknown = true;
|
||||||
|
}
|
||||||
|
|
||||||
// assume that it's not a dereference (no false positives)
|
// assume that it's not a dereference (no false positives)
|
||||||
return false;
|
return false;
|
||||||
|
@ -355,7 +361,7 @@ void CheckNullPointer::nullPointerAfterLoop()
|
||||||
// loop variable is found..
|
// loop variable is found..
|
||||||
else if (tok2->varId() == varid) {
|
else if (tok2->varId() == varid) {
|
||||||
// dummy variable.. is it unknown if pointer is dereferenced or not?
|
// dummy variable.. is it unknown if pointer is dereferenced or not?
|
||||||
bool unknown = false;
|
bool unknown = _settings->inconclusive;
|
||||||
|
|
||||||
// Is the loop variable dereferenced?
|
// Is the loop variable dereferenced?
|
||||||
if (CheckNullPointer::isPointerDeRef(tok2, unknown)) {
|
if (CheckNullPointer::isPointerDeRef(tok2, unknown)) {
|
||||||
|
@ -921,7 +927,7 @@ void CheckNullPointer::nullPointerByCheckAndDeRef()
|
||||||
// unknown: this is set to true by isPointerDeRef if
|
// unknown: this is set to true by isPointerDeRef if
|
||||||
// the function fails to determine if there
|
// the function fails to determine if there
|
||||||
// is a dereference or not
|
// is a dereference or not
|
||||||
bool unknown = false;
|
bool unknown = _settings->inconclusive;
|
||||||
|
|
||||||
if (Token::Match(tok2->previous(), "[;{}=] %var% = 0 ;"))
|
if (Token::Match(tok2->previous(), "[;{}=] %var% = 0 ;"))
|
||||||
;
|
;
|
||||||
|
@ -1153,7 +1159,7 @@ private:
|
||||||
// unknown : not really used. it is passed to isPointerDeRef.
|
// unknown : not really used. it is passed to isPointerDeRef.
|
||||||
// if isPointerDeRef fails to determine if there
|
// if isPointerDeRef fails to determine if there
|
||||||
// is a dereference the this will be set to true.
|
// is a dereference the this will be set to true.
|
||||||
bool unknown = false;
|
bool unknown = owner->inconclusiveFlag();
|
||||||
|
|
||||||
if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;"))
|
if (Token::Match(tok.previous(), "[;{}=] %var% = 0 ;"))
|
||||||
setnull(checks, tok.varId());
|
setnull(checks, tok.varId());
|
||||||
|
|
Loading…
Reference in New Issue