Fixed #483 (False positive: found leak when foreach for lists used)
This commit is contained in:
parent
14fd0154d2
commit
b5cbc509f3
|
@ -1081,10 +1081,22 @@ Token *CheckMemoryLeakInFunction::getcode(const Token *tok, std::list<const Toke
|
||||||
// Investigate function calls..
|
// Investigate function calls..
|
||||||
if (Token::Match(tok, "%var% ("))
|
if (Token::Match(tok, "%var% ("))
|
||||||
{
|
{
|
||||||
|
// A function call should normally be followed by ";"
|
||||||
|
if (Token::simpleMatch(tok->next()->link(), ") {"))
|
||||||
|
{
|
||||||
|
if (!Token::Match(tok, "if|for|while|switch"))
|
||||||
|
{
|
||||||
|
addtoken("exit");
|
||||||
|
addtoken(";");
|
||||||
|
tok = tok->next()->link();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Inside class function.. if the var is passed as a parameter then
|
// Inside class function.. if the var is passed as a parameter then
|
||||||
// just add a "::use"
|
// just add a "::use"
|
||||||
// The "::use" means that a member function was probably called but it wasn't analyzed further
|
// The "::use" means that a member function was probably called but it wasn't analyzed further
|
||||||
if (classmember)
|
else if (classmember)
|
||||||
{
|
{
|
||||||
int parlevel = 1;
|
int parlevel = 1;
|
||||||
for (const Token *tok2 = tok->tokAt(2); tok2; tok2 = tok2->next())
|
for (const Token *tok2 = tok->tokAt(2); tok2; tok2 = tok2->next())
|
||||||
|
@ -1746,6 +1758,11 @@ const Token *CheckMemoryLeakInFunction::findleak(const Token *tokens, bool all)
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (Token::Match(tokens, "alloc ; if|if(var)|ifv break|continue|return ;"))
|
||||||
|
{
|
||||||
|
return tokens->tokAt(3);
|
||||||
|
}
|
||||||
|
|
||||||
if ((result = Token::findmatch(tokens, "alloc ; if|if(var)|ifv return ;")) != NULL)
|
if ((result = Token::findmatch(tokens, "alloc ; if|if(var)|ifv return ;")) != NULL)
|
||||||
{
|
{
|
||||||
return result->tokAt(3);
|
return result->tokAt(3);
|
||||||
|
|
|
@ -403,6 +403,9 @@ private:
|
||||||
ASSERT_EQUALS(";;exit;", getcode("char *s; err(0);", "s"));
|
ASSERT_EQUALS(";;exit;", getcode("char *s; err(0);", "s"));
|
||||||
ASSERT_EQUALS(";;if{exit;}", getcode("char *s; if (a) { exit(0); }", "s"));
|
ASSERT_EQUALS(";;if{exit;}", getcode("char *s; if (a) { exit(0); }", "s"));
|
||||||
|
|
||||||
|
// list_for_each
|
||||||
|
ASSERT_EQUALS(";;exit;{}", getcode("char *s; list_for_each(x,y,z) { }", "s"));
|
||||||
|
|
||||||
// open/close
|
// open/close
|
||||||
ASSERT_EQUALS(";;alloc;if(var){dealloc;}", getcode("int f; f=open(); if(f>=0)close(f);", "f"));
|
ASSERT_EQUALS(";;alloc;if(var){dealloc;}", getcode("int f; f=open(); if(f>=0)close(f);", "f"));
|
||||||
ASSERT_EQUALS(";;alloc;ifv{;}", getcode("int f; f=open(); if(f!=-1 || x);", "f"));
|
ASSERT_EQUALS(";;alloc;ifv{;}", getcode("int f; f=open(); if(f!=-1 || x);", "f"));
|
||||||
|
@ -576,6 +579,7 @@ private:
|
||||||
// if..
|
// if..
|
||||||
ASSERT_EQUALS(-1, dofindleak("alloc; ifv dealloc;"));
|
ASSERT_EQUALS(-1, dofindleak("alloc; ifv dealloc;"));
|
||||||
ASSERT_EQUALS(2, dofindleak("alloc;\n if return;\n dealloc;"));
|
ASSERT_EQUALS(2, dofindleak("alloc;\n if return;\n dealloc;"));
|
||||||
|
ASSERT_EQUALS(2, dofindleak("alloc;\n if continue;\n dealloc;"));
|
||||||
ASSERT_EQUALS(2, dofindleak("alloc;\n if_var return;\n dealloc;"));
|
ASSERT_EQUALS(2, dofindleak("alloc;\n if_var return;\n dealloc;"));
|
||||||
ASSERT_EQUALS(3, dofindleak("alloc;\n if\n return;\n dealloc;"));
|
ASSERT_EQUALS(3, dofindleak("alloc;\n if\n return;\n dealloc;"));
|
||||||
ASSERT_EQUALS(-1, dofindleak("alloc; if { dealloc ; return; } dealloc;"));
|
ASSERT_EQUALS(-1, dofindleak("alloc; if { dealloc ; return; } dealloc;"));
|
||||||
|
|
Loading…
Reference in New Issue