This commit is contained in:
Sébastien Debrard 2011-01-22 14:06:13 +01:00
commit bc0524dec3
5 changed files with 50 additions and 32 deletions

View File

@ -583,6 +583,11 @@ void CheckClass::privateFunctions()
if (Token::findmatch(_tokenizer->tokens(), "; __property ;")) if (Token::findmatch(_tokenizer->tokens(), "; __property ;"))
return; return;
// skip checking if there are friends
// Todo: check if each class has friends
if (Token::findmatch(_tokenizer->tokens(), "friend"))
return;
// #2407 calls from operator() is not detected // #2407 calls from operator() is not detected
// TODO: Don't bailout. Detect the call. // TODO: Don't bailout. Detect the call.
if (Token::findmatch(_tokenizer->tokens(), "operator ( )")) if (Token::findmatch(_tokenizer->tokens(), "operator ( )"))

View File

@ -3101,7 +3101,8 @@ void CheckMemoryLeakStructMember::check()
else if (tok3->str() == "return") else if (tok3->str() == "return")
{ {
// Returning from function without deallocating struct member? // Returning from function without deallocating struct member?
if (!Token::Match(tok3, "return %varid% ;", structid)) if (!Token::Match(tok3, "return %varid% ;", structid) &&
!Token::Match(tok3, "return & %varid% .", structid))
{ {
memoryLeak(tok3, (vartok->str() + "." + tok2->strAt(2)).c_str(), Malloc); memoryLeak(tok3, (vartok->str() + "." + tok2->strAt(2)).c_str(), Malloc);
} }

View File

@ -2651,35 +2651,6 @@ static void removeTemplates(Token *tok)
void Tokenizer::simplifyTemplates() void Tokenizer::simplifyTemplates()
{ {
// Don't simplify C files
{
if (_files.empty())
return;
std::string::size_type pos = _files[0].rfind(".");
if (pos == std::string::npos)
return;
const std::string ext(_files[0].substr(pos));
if (ext == ".c" || ext == ".C")
return;
}
// Remove "typename" unless used in template arguments..
for (Token *tok = _tokens; tok; tok = tok->next())
{
if (tok->str() == "typename")
tok->deleteThis();
if (Token::simpleMatch(tok, "template <"))
{
while (tok && tok->str() != ">")
tok = tok->next();
if (!tok)
break;
}
}
std::set<std::string> expandedtemplates; std::set<std::string> expandedtemplates;
// Locate specialized templates.. // Locate specialized templates..
@ -2775,6 +2746,22 @@ void Tokenizer::simplifyTemplates()
return; return;
} }
// There are templates..
// Remove "typename" unless used in template arguments..
for (Token *tok = _tokens; tok; tok = tok->next())
{
if (tok->str() == "typename")
tok->deleteThis();
if (Token::simpleMatch(tok, "template <"))
{
while (tok && tok->str() != ">")
tok = tok->next();
if (!tok)
break;
}
}
// Locate possible instantiations of templates.. // Locate possible instantiations of templates..
std::list<Token *> used; std::list<Token *> used;
for (Token *tok = _tokens; tok; tok = tok->next()) for (Token *tok = _tokens; tok; tok = tok->next())

View File

@ -4206,7 +4206,8 @@ private:
TEST_CASE(goto_); TEST_CASE(goto_);
// Don't report errors if the struct is returned // Don't report errors if the struct is returned
TEST_CASE(ret); TEST_CASE(ret1);
TEST_CASE(ret2);
// assignments // assignments
TEST_CASE(assign); TEST_CASE(assign);
@ -4284,7 +4285,7 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void ret() void ret1()
{ {
check("static ABC * foo()\n" check("static ABC * foo()\n"
"{\n" "{\n"
@ -4301,6 +4302,17 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void ret2()
{
check("static ABC * foo()\n"
"{\n"
" struct ABC *abc = malloc(sizeof(struct ABC));\n"
" abc->a = malloc(10);\n"
" return &abc->self;\n"
"}\n");
ASSERT_EQUALS("", errout.str());
}
void assign() void assign()
{ {
check("static void foo()\n" check("static void foo()\n"

View File

@ -53,6 +53,8 @@ private:
TEST_CASE(derivedClass); // skip warning for derived classes. It might be a virtual function. TEST_CASE(derivedClass); // skip warning for derived classes. It might be a virtual function.
TEST_CASE(friendClass);
TEST_CASE(borland); // skip FP when using __property TEST_CASE(borland); // skip FP when using __property
// No false positives when there are "unused" templates that are removed in the simplified token list // No false positives when there are "unused" templates that are removed in the simplified token list
@ -387,6 +389,17 @@ private:
ASSERT_EQUALS("", errout.str()); ASSERT_EQUALS("", errout.str());
} }
void friendClass()
{
// ticket #2459 - friend class
check("class Foo {\n"
"private:\n"
" friend Bar;\n"
" void f() { }\n"
"};");
ASSERT_EQUALS("", errout.str());
}
void borland() void borland()
{ {
// ticket #2034 - Borland C++ __property // ticket #2034 - Borland C++ __property