memory leaks: Handling exit (#297)
This commit is contained in:
parent
f2a5527e60
commit
daea0547fa
|
@ -662,6 +662,10 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
if (Token::Match(tok, "try|throw|catch"))
|
if (Token::Match(tok, "try|throw|catch"))
|
||||||
addtoken(tok->strAt(0));
|
addtoken(tok->strAt(0));
|
||||||
|
|
||||||
|
// exit..
|
||||||
|
if (Token::Match(tok->previous(), "[{};] exit ( %any% ) ;"))
|
||||||
|
addtoken("exit");
|
||||||
|
|
||||||
// Assignment..
|
// Assignment..
|
||||||
if (Token::Match(tok, std::string("[)=] " + varnameStr + " [+;)]").c_str()) ||
|
if (Token::Match(tok, std::string("[)=] " + varnameStr + " [+;)]").c_str()) ||
|
||||||
Token::Match(tok, std::string(varnameStr + " +=|-=").c_str()) ||
|
Token::Match(tok, std::string(varnameStr + " +=|-=").c_str()) ||
|
||||||
|
@ -771,6 +775,23 @@ void CheckMemoryLeakClass::simplifycode(Token *tok, bool &all)
|
||||||
tok2->str("return");
|
tok2->str("return");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// simplify "exit".. remove everything in its execution path
|
||||||
|
for (Token *tok2 = tok; tok2; tok2 = tok2->next())
|
||||||
|
{
|
||||||
|
if (tok2->str() != "exit")
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Found an "exit".. try to remove everything before it
|
||||||
|
const Token *tokEnd = tok2->next();
|
||||||
|
while (tok2->previous() && !Token::Match(tok2->previous(), "[{}]"))
|
||||||
|
tok2 = tok2->previous();
|
||||||
|
if (tok2->previous())
|
||||||
|
tok2 = tok2->previous();
|
||||||
|
|
||||||
|
Token::eraseTokens(tok2, tokEnd);
|
||||||
|
}
|
||||||
|
|
||||||
// reduce the code..
|
// reduce the code..
|
||||||
bool done = false;
|
bool done = false;
|
||||||
while (! done)
|
while (! done)
|
||||||
|
|
|
@ -208,6 +208,11 @@ private:
|
||||||
TEST_CASE(free_member_in_sub_func);
|
TEST_CASE(free_member_in_sub_func);
|
||||||
TEST_CASE(if_with_and);
|
TEST_CASE(if_with_and);
|
||||||
TEST_CASE(assign_pclose);
|
TEST_CASE(assign_pclose);
|
||||||
|
|
||||||
|
// Using the function "exit"
|
||||||
|
TEST_CASE(exit1);
|
||||||
|
TEST_CASE(exit2);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -2121,6 +2126,32 @@ private:
|
||||||
"}\n");
|
"}\n");
|
||||||
ASSERT_EQUALS(std::string(""), errout.str());
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void exit1()
|
||||||
|
{
|
||||||
|
// Ticket #297
|
||||||
|
check("void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char *out = new char[100];\n"
|
||||||
|
" if (c())\n"
|
||||||
|
" {\n"
|
||||||
|
" delete [] out;\n"
|
||||||
|
" exit(0);\n"
|
||||||
|
" }\n"
|
||||||
|
" delete [] out;\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
void exit2()
|
||||||
|
{
|
||||||
|
check("void f()\n"
|
||||||
|
"{\n"
|
||||||
|
" char *out = new char[100];\n"
|
||||||
|
" exit(0);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS(std::string(""), errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestMemleak)
|
REGISTER_TEST(TestMemleak)
|
||||||
|
|
Loading…
Reference in New Issue