Fixed #5559 (false positive: (error) Possible null pointer dereference: pSTRunner)
This commit is contained in:
parent
806daf7644
commit
853d56030b
|
@ -531,6 +531,7 @@ static void valueFlowAfterAssign(TokenList *tokenlist, ErrorLogger *errorLogger,
|
||||||
int indentlevel = 0;
|
int indentlevel = 0;
|
||||||
unsigned int number_of_if = 0;
|
unsigned int number_of_if = 0;
|
||||||
int varusagelevel = -1;
|
int varusagelevel = -1;
|
||||||
|
bool returnStatement = false; // current statement is a return, stop analysis at the ";"
|
||||||
|
|
||||||
for (Token *tok2 = tok; tok2 && tok2 != endToken; tok2 = tok2->next()) {
|
for (Token *tok2 = tok; tok2 && tok2 != endToken; tok2 = tok2->next()) {
|
||||||
if (indentlevel >= 0 && tok2->str() == "{")
|
if (indentlevel >= 0 && tok2->str() == "{")
|
||||||
|
@ -611,12 +612,18 @@ static void valueFlowAfterAssign(TokenList *tokenlist, ErrorLogger *errorLogger,
|
||||||
tok2 = tok2->linkAt(2);
|
tok2 = tok2->linkAt(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (Token::Match(tok2, "break|continue")) {
|
else if (indentlevel <= 0 && Token::Match(tok2, "break|continue")) {
|
||||||
if (settings->debugwarnings)
|
if (settings->debugwarnings)
|
||||||
bailout(tokenlist, errorLogger, tok2, "variable " + var->nameToken()->str() + ". noreturn conditional scope.");
|
bailout(tokenlist, errorLogger, tok2, "variable " + var->nameToken()->str() + ". noreturn conditional scope.");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
else if (indentlevel <= 0 && tok2->str() == "return")
|
||||||
|
returnStatement = true;
|
||||||
|
|
||||||
|
else if (returnStatement && tok2->str() == ";")
|
||||||
|
break;
|
||||||
|
|
||||||
if (tok2->varId() == varid) {
|
if (tok2->varId() == varid) {
|
||||||
// bailout: assignment
|
// bailout: assignment
|
||||||
if (Token::Match(tok2->previous(), "!!* %var% =")) {
|
if (Token::Match(tok2->previous(), "!!* %var% =")) {
|
||||||
|
|
|
@ -613,6 +613,16 @@ private:
|
||||||
"}";
|
"}";
|
||||||
ASSERT_EQUALS(false, testValueOfX(code, 6U, 0));
|
ASSERT_EQUALS(false, testValueOfX(code, 6U, 0));
|
||||||
|
|
||||||
|
code = "void f () {\n"
|
||||||
|
" ST * x = g_pST;\n"
|
||||||
|
" if (x->y == 0) {\n"
|
||||||
|
" x = NULL;\n"
|
||||||
|
" return 1;\n"
|
||||||
|
" }\n"
|
||||||
|
" a = x->y;\n"
|
||||||
|
"}";
|
||||||
|
ASSERT_EQUALS(false, testValueOfX(code, 7U, 0));
|
||||||
|
|
||||||
// multivariables
|
// multivariables
|
||||||
code = "void f(int a) {\n"
|
code = "void f(int a) {\n"
|
||||||
" int x = a;\n"
|
" int x = a;\n"
|
||||||
|
|
Loading…
Reference in New Issue