- Fixed false positive when passing pointer to typeof()
This commit is contained in:
parent
cd87699eb1
commit
ecb0e70250
|
@ -344,11 +344,11 @@ bool CheckNullPointer::isPointerDeRef(const Token *tok, bool &unknown)
|
||||||
prev = prev->link()->previous();
|
prev = prev->link()->previous();
|
||||||
|
|
||||||
// Dereferencing pointer..
|
// Dereferencing pointer..
|
||||||
if (prev->str() == "*" && (Token::Match(prev->previous(), "return|throw|;|{|}|:|[|(|,") || prev->previous()->isOp()) && !Token::Match(prev->tokAt(-2), "sizeof|decltype"))
|
if (prev->str() == "*" && (Token::Match(prev->previous(), "return|throw|;|{|}|:|[|(|,") || prev->previous()->isOp()) && !Token::Match(prev->tokAt(-2), "sizeof|decltype|typeof"))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
// read/write member variable
|
// read/write member variable
|
||||||
if (!Token::simpleMatch(prev->previous(), "& (") && !Token::Match(prev->previous(), "sizeof|decltype (") && prev->str() != "&" && Token::Match(tok->next(), ". %var%")) {
|
if (!Token::simpleMatch(prev->previous(), "& (") && !Token::Match(prev->previous(), "sizeof|decltype|typeof (") && prev->str() != "&" && Token::Match(tok->next(), ". %var%")) {
|
||||||
if (tok->strAt(3) != "(")
|
if (tok->strAt(3) != "(")
|
||||||
return true;
|
return true;
|
||||||
unknown = true;
|
unknown = true;
|
||||||
|
@ -623,8 +623,8 @@ void CheckNullPointer::nullPointerStructByDeRefAndChec()
|
||||||
tok1 = tok1->next();
|
tok1 = tok1->next();
|
||||||
}
|
}
|
||||||
|
|
||||||
// dereference in function call (but not sizeof|decltype)
|
// dereference in function call (but not sizeof|decltype|typeof)
|
||||||
else if ((Token::Match(tok1->tokAt(-2), "%var% ( %var% . %var%") && !Token::Match(tok1->tokAt(-2), "sizeof|decltype ( %var% . %var%")) ||
|
else if ((Token::Match(tok1->tokAt(-2), "%var% ( %var% . %var%") && !Token::Match(tok1->tokAt(-2), "sizeof|decltype|typeof ( %var% . %var%")) ||
|
||||||
Token::Match(tok1->previous(), ", %var% . %var%")) {
|
Token::Match(tok1->previous(), ", %var% . %var%")) {
|
||||||
// Is the function return value taken by the pointer?
|
// Is the function return value taken by the pointer?
|
||||||
bool assignment = false;
|
bool assignment = false;
|
||||||
|
@ -1071,7 +1071,7 @@ void CheckNullPointer::nullPointerByCheckAndDeRef()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// parameters to sizeof are not dereferenced
|
// parameters to sizeof are not dereferenced
|
||||||
if (Token::Match(tok2, "decltype|sizeof")) {
|
if (Token::Match(tok2, "decltype|sizeof|typeof")) {
|
||||||
if (tok2->strAt(1) != "(")
|
if (tok2->strAt(1) != "(")
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
else
|
else
|
||||||
|
@ -1161,7 +1161,7 @@ void CheckNullPointer::nullConstantDereference()
|
||||||
tok = scope->function->token; // Check initialization list
|
tok = scope->function->token; // Check initialization list
|
||||||
|
|
||||||
for (; tok != scope->classEnd; tok = tok->next()) {
|
for (; tok != scope->classEnd; tok = tok->next()) {
|
||||||
if (Token::Match(tok, "sizeof|decltype|typeid ("))
|
if (Token::Match(tok, "sizeof|decltype|typeid|typeof ("))
|
||||||
tok = tok->next()->link();
|
tok = tok->next()->link();
|
||||||
|
|
||||||
else if (Token::simpleMatch(tok, "* 0")) {
|
else if (Token::simpleMatch(tok, "* 0")) {
|
||||||
|
|
|
@ -1679,6 +1679,11 @@ private:
|
||||||
" itoa(x,NULL,10);\n"
|
" itoa(x,NULL,10);\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:2]: (error) Null pointer dereference\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" typeof(*NULL) y;\n"
|
||||||
|
"}", true);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void gcc_statement_expression() {
|
void gcc_statement_expression() {
|
||||||
|
|
Loading…
Reference in New Issue