Fix #368 (Leak detected when allocated memory assigned to member of structure which returned from function)
The return value of strcpy wasn't handled very well
This commit is contained in:
parent
acaa22ff6c
commit
a8c5526c84
|
@ -595,25 +595,25 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
addtoken(tok->str().c_str());
|
addtoken(tok->str().c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tok->str() == "case"))
|
else if ((tok->str() == "case"))
|
||||||
{
|
{
|
||||||
addtoken("case");
|
addtoken("case");
|
||||||
addtoken(";");
|
addtoken(";");
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((tok->str() == "default"))
|
else if ((tok->str() == "default"))
|
||||||
{
|
{
|
||||||
addtoken("default");
|
addtoken("default");
|
||||||
addtoken(";");
|
addtoken(";");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Loops..
|
// Loops..
|
||||||
if ((tok->str() == "for") || (tok->str() == "while"))
|
else if ((tok->str() == "for") || (tok->str() == "while"))
|
||||||
{
|
{
|
||||||
addtoken("loop");
|
addtoken("loop");
|
||||||
isloop = true;
|
isloop = true;
|
||||||
}
|
}
|
||||||
if ((tok->str() == "do"))
|
else if ((tok->str() == "do"))
|
||||||
{
|
{
|
||||||
addtoken("do");
|
addtoken("do");
|
||||||
}
|
}
|
||||||
|
@ -633,7 +633,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return..
|
// Return..
|
||||||
if (tok->str() == "return")
|
else if (tok->str() == "return")
|
||||||
{
|
{
|
||||||
addtoken("return");
|
addtoken("return");
|
||||||
|
|
||||||
|
@ -684,7 +684,7 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
}
|
}
|
||||||
|
|
||||||
// throw..
|
// throw..
|
||||||
if (Token::Match(tok, "try|throw|catch"))
|
else if (Token::Match(tok, "try|throw|catch"))
|
||||||
addtoken(tok->strAt(0));
|
addtoken(tok->strAt(0));
|
||||||
|
|
||||||
// exit..
|
// exit..
|
||||||
|
@ -694,7 +694,8 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
// 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()) ||
|
||||||
Token::Match(tok, std::string("+=|<< " + varnameStr + " ;").c_str()))
|
Token::Match(tok, std::string("+=|<< " + varnameStr + " ;").c_str()) ||
|
||||||
|
Token::Match(tok, std::string("= strcpy|strcat|memmove|memcpy ( " + varnameStr + " ,").c_str()))
|
||||||
{
|
{
|
||||||
addtoken("use");
|
addtoken("use");
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,6 +190,7 @@ private:
|
||||||
// free a free'd pointer
|
// free a free'd pointer
|
||||||
TEST_CASE(freefree1);
|
TEST_CASE(freefree1);
|
||||||
TEST_CASE(freefree2);
|
TEST_CASE(freefree2);
|
||||||
|
TEST_CASE(strcpy_result_assignment);
|
||||||
TEST_CASE(strcat_result_assignment);
|
TEST_CASE(strcat_result_assignment);
|
||||||
|
|
||||||
TEST_CASE(all1); // Extra checking when --all is given
|
TEST_CASE(all1); // Extra checking when --all is given
|
||||||
|
@ -1974,6 +1975,16 @@ private:
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void strcpy_result_assignment()
|
||||||
|
{
|
||||||
|
check("void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" char *p1 = malloc(10);\n"
|
||||||
|
" char *p2 = strcpy(p1, \"a\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
|
|
||||||
void strcat_result_assignment()
|
void strcat_result_assignment()
|
||||||
{
|
{
|
||||||
check("void foo()\n"
|
check("void foo()\n"
|
||||||
|
|
Loading…
Reference in New Issue