Fixed #1719 (False negative: memory leak (fgets in condition))
This commit is contained in:
parent
9b1ed1112b
commit
45821b3871
|
@ -963,7 +963,7 @@ Token *CheckMemoryLeakInFunction::getcode(const Token *tok, std::list<const Toke
|
||||||
dep = true;
|
dep = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (innerParlevel > 0 && Token::Match(tok2, "%var% ("))
|
if (innerParlevel > 0 && Token::Match(tok2, "%var% (") && !test_white_list(tok2->str()))
|
||||||
{
|
{
|
||||||
bool use = false;
|
bool use = false;
|
||||||
for (const Token *tok3 = tok2->tokAt(2); tok3; tok3 = tok3->next())
|
for (const Token *tok3 = tok2->tokAt(2); tok3; tok3 = tok3->next())
|
||||||
|
@ -1974,6 +1974,12 @@ const Token *CheckMemoryLeakInFunction::findleak(const Token *tokens)
|
||||||
return result->tokAt(3);
|
return result->tokAt(3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (((result = Token::findmatch(tokens, "; alloc ; if dealloc ; }")) != NULL) &&
|
||||||
|
!result->tokAt(7))
|
||||||
|
{
|
||||||
|
return result->tokAt(6);
|
||||||
|
}
|
||||||
|
|
||||||
if ((result = Token::findmatch(tokens, "alloc ; }")) != NULL)
|
if ((result = Token::findmatch(tokens, "alloc ; }")) != NULL)
|
||||||
{
|
{
|
||||||
if (result->tokAt(3) == NULL)
|
if (result->tokAt(3) == NULL)
|
||||||
|
|
|
@ -248,7 +248,6 @@ private:
|
||||||
TEST_CASE(ifelse6);
|
TEST_CASE(ifelse6);
|
||||||
TEST_CASE(ifelse7);
|
TEST_CASE(ifelse7);
|
||||||
TEST_CASE(ifelse8);
|
TEST_CASE(ifelse8);
|
||||||
TEST_CASE(ifelse9);
|
|
||||||
TEST_CASE(ifelse10);
|
TEST_CASE(ifelse10);
|
||||||
|
|
||||||
TEST_CASE(if4);
|
TEST_CASE(if4);
|
||||||
|
@ -463,6 +462,7 @@ private:
|
||||||
ASSERT_EQUALS(";;if(!var){}", getcode("char *s; if (a && !s) { }", "s"));
|
ASSERT_EQUALS(";;if(!var){}", getcode("char *s; if (a && !s) { }", "s"));
|
||||||
ASSERT_EQUALS(";;ifv{}", getcode("char *s; if (foo(!s)) { }", "s"));
|
ASSERT_EQUALS(";;ifv{}", getcode("char *s; if (foo(!s)) { }", "s"));
|
||||||
ASSERT_EQUALS(";;;if{dealloc;};if{dealloc;return;}assign;returnuse;", getcode("char *buf, *tmp; tmp = realloc(buf, 40); if (!(tmp)) { free(buf); return; } buf = tmp; return buf;", "buf"));
|
ASSERT_EQUALS(";;;if{dealloc;};if{dealloc;return;}assign;returnuse;", getcode("char *buf, *tmp; tmp = realloc(buf, 40); if (!(tmp)) { free(buf); return; } buf = tmp; return buf;", "buf"));
|
||||||
|
ASSERT_EQUALS(";;if{}", getcode("FILE *f; if (fgets(buf,100,f)){}", "f"));
|
||||||
|
|
||||||
// switch..
|
// switch..
|
||||||
ASSERT_EQUALS(";;switch{case;;break;};", getcode("char *s; switch(a){case 1: break;};", "s"));
|
ASSERT_EQUALS(";;switch{case;;break;};", getcode("char *s; switch(a){case 1: break;};", "s"));
|
||||||
|
@ -770,6 +770,8 @@ private:
|
||||||
ASSERT_EQUALS(notfound, dofindleak("alloc; if { return use; } dealloc;"));
|
ASSERT_EQUALS(notfound, dofindleak("alloc; if { return use; } dealloc;"));
|
||||||
ASSERT_EQUALS(notfound, dofindleak("alloc; if { dealloc; return; } dealloc;"));
|
ASSERT_EQUALS(notfound, dofindleak("alloc; if { dealloc; return; } dealloc;"));
|
||||||
|
|
||||||
|
ASSERT_EQUALS(5, dofindleak("{\n;\n alloc;\n if dealloc;\n}"));
|
||||||
|
|
||||||
// assign..
|
// assign..
|
||||||
ASSERT_EQUALS(2, dofindleak("alloc;\n assign;\n dealloc;"));
|
ASSERT_EQUALS(2, dofindleak("alloc;\n assign;\n dealloc;"));
|
||||||
ASSERT_EQUALS(notfound, dofindleak("alloc;\n if(!var) assign;\n dealloc;"));
|
ASSERT_EQUALS(notfound, dofindleak("alloc;\n if(!var) assign;\n dealloc;"));
|
||||||
|
@ -781,10 +783,6 @@ private:
|
||||||
ASSERT_EQUALS(notfound, dofindleak("; loop { alloc ; if break; } dealloc ;"));
|
ASSERT_EQUALS(notfound, dofindleak("; loop { alloc ; if break; } dealloc ;"));
|
||||||
ASSERT_EQUALS(1, dofindleak("; loop alloc ;"));
|
ASSERT_EQUALS(1, dofindleak("; loop alloc ;"));
|
||||||
ASSERT_EQUALS(1, dofindleak("; loop alloc ; dealloc ;"));
|
ASSERT_EQUALS(1, dofindleak("; loop alloc ; dealloc ;"));
|
||||||
|
|
||||||
// Todo..
|
|
||||||
ASSERT_EQUALS(notfound, dofindleak("; alloc;\n if { dealloc; }\n ;"));
|
|
||||||
TODO_ASSERT_EQUALS(3, dofindleak("; alloc;\n if { dealloc; }\n ;"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -979,21 +977,6 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void ifelse9()
|
|
||||||
{
|
|
||||||
check("static char *f()\n"
|
|
||||||
"{\n"
|
|
||||||
" char *s = new char[10];\n"
|
|
||||||
" if ( ghfgf )\n"
|
|
||||||
" {\n"
|
|
||||||
" delete [] s;\n"
|
|
||||||
" }\n"
|
|
||||||
"}\n");
|
|
||||||
ASSERT_EQUALS("", errout.str());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void ifelse10()
|
void ifelse10()
|
||||||
{
|
{
|
||||||
check("static char *f()\n"
|
check("static char *f()\n"
|
||||||
|
@ -1235,7 +1218,7 @@ private:
|
||||||
" };\n"
|
" };\n"
|
||||||
"}\n");
|
"}\n");
|
||||||
check(code.c_str(), false);
|
check(code.c_str(), false);
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("[test.cpp:12]: (error) Memory leak: str\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void switch3()
|
void switch3()
|
||||||
|
|
Loading…
Reference in New Issue