CheckNullPointer: improved function call checking when new value flow analysis is used
This commit is contained in:
parent
2e67ca06c0
commit
5d2a39b580
|
@ -762,18 +762,42 @@ void CheckNullPointer::nullPointerByDeRefAndChec()
|
||||||
if (!var || !var->isPointer())
|
if (!var || !var->isPointer())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
const ValueFlow::Value *value = 0;
|
||||||
|
for (std::list<ValueFlow::Value>::const_iterator it = tok->values.begin(); it != tok->values.end(); ++it) {
|
||||||
|
if (it->intvalue == 0) {
|
||||||
|
value = &(*it);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!value)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (Token::Match(tok->previous(), "[(,] %var% [,)]")) {
|
||||||
|
const Token *ftok = tok->previous();
|
||||||
|
while (ftok && ftok->str() != "(") {
|
||||||
|
if (ftok->str() == ")")
|
||||||
|
ftok = ftok->link();
|
||||||
|
ftok = ftok->previous();
|
||||||
|
}
|
||||||
|
std::list<const Token *> varlist;
|
||||||
|
parseFunctionCall(*ftok->previous(), varlist, &_settings->library, 0);
|
||||||
|
if (std::find(varlist.begin(), varlist.end(), tok) != varlist.end()) {
|
||||||
|
if (value->condition == NULL)
|
||||||
|
nullPointerError(tok);
|
||||||
|
else if (_settings->isEnabled("warning"))
|
||||||
|
nullPointerError(tok, tok->str(), value->condition, false);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
bool unknown = false;
|
bool unknown = false;
|
||||||
if (!isPointerDeRef(tok,unknown))
|
if (!isPointerDeRef(tok,unknown))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
for (std::list<ValueFlow::Value>::const_iterator it = tok->values.begin(); it != tok->values.end(); ++it) {
|
if (value->condition == NULL)
|
||||||
if (it->intvalue != 0)
|
nullPointerError(tok);
|
||||||
continue;
|
else if (_settings->isEnabled("warning"))
|
||||||
if (it->condition == NULL)
|
nullPointerError(tok, tok->str(), value->condition, false);
|
||||||
nullPointerError(tok);
|
|
||||||
else if (_settings->isEnabled("warning"))
|
|
||||||
nullPointerError(tok, tok->str(), it->condition, false);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -88,6 +88,13 @@ private:
|
||||||
settings.inconclusive = inconclusive;
|
settings.inconclusive = inconclusive;
|
||||||
//settings.valueFlow = true;
|
//settings.valueFlow = true;
|
||||||
|
|
||||||
|
// cfg
|
||||||
|
const char cfg[] = "<?xml version=\"1.0\"?>\n"
|
||||||
|
"<def>\n"
|
||||||
|
" <function name=\"strcpy\"> <arg nr=\"1\"><not-null/></arg> </function>\n"
|
||||||
|
"</def>";
|
||||||
|
settings.library.loadxmldata(cfg, sizeof(cfg));
|
||||||
|
|
||||||
// Tokenize..
|
// Tokenize..
|
||||||
Tokenizer tokenizer(&settings, this);
|
Tokenizer tokenizer(&settings, this);
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
|
|
Loading…
Reference in New Issue