Double free: Improved handling of noreturn functions. Partial revert of previous fix.
This commit is contained in:
parent
636a15ac55
commit
42b85088c5
|
@ -168,14 +168,6 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
||||||
if (tok->str() == "(" && tok->previous()->isName()) {
|
if (tok->str() == "(" && tok->previous()->isName()) {
|
||||||
functionCall(tok->previous(), varInfo, NOALLOC);
|
functionCall(tok->previous(), varInfo, NOALLOC);
|
||||||
tok = tok->link();
|
tok = tok->link();
|
||||||
|
|
||||||
if (Token::simpleMatch(tok,") ; }")) {
|
|
||||||
bool unknown = false;
|
|
||||||
const bool noreturn = _tokenizer->IsScopeNoReturn(tok->tokAt(2), &unknown);
|
|
||||||
if (noreturn)
|
|
||||||
varInfo->clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,15 +353,12 @@ void CheckLeakAutoVar::checkScope(const Token * const startToken,
|
||||||
if (dealloc == NOALLOC && Token::simpleMatch(tok, ") ; }")) {
|
if (dealloc == NOALLOC && Token::simpleMatch(tok, ") ; }")) {
|
||||||
const std::string &functionName(tok->link()->previous()->str());
|
const std::string &functionName(tok->link()->previous()->str());
|
||||||
bool unknown = false;
|
bool unknown = false;
|
||||||
if (_settings->library.leakignore.find(functionName) == _settings->library.leakignore.end() &&
|
if (_tokenizer->IsScopeNoReturn(tok->tokAt(2), &unknown)) {
|
||||||
_settings->library.use.find(functionName) == _settings->library.use.end() &&
|
if (!unknown)
|
||||||
_tokenizer->IsScopeNoReturn(tok->tokAt(2), &unknown)) {
|
|
||||||
if (unknown) {
|
|
||||||
//const std::string &functionName(tok->link()->previous()->str());
|
|
||||||
varInfo->possibleUsageAll(functionName);
|
|
||||||
} else {
|
|
||||||
varInfo->clear();
|
varInfo->clear();
|
||||||
}
|
else if (_settings->library.leakignore.find(functionName) == _settings->library.leakignore.end() &&
|
||||||
|
_settings->library.use.find(functionName) == _settings->library.use.end())
|
||||||
|
varInfo->possibleUsageAll(functionName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -350,12 +350,12 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void doublefree4() { // #5451 - exit
|
void doublefree4() { // #5451 - exit
|
||||||
check("void foo(char *p) {\n"
|
check("void f(char *p) {\n"
|
||||||
" if (x) {\n"
|
" if (x) {\n"
|
||||||
" free(p)\n"
|
" free(p);\n"
|
||||||
" exit(1);\n"
|
" exit(1);\n"
|
||||||
" }\n"
|
" }\n"
|
||||||
" free(p);\n"
|
" free(p);\n"
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue