Merge branch 'master' of http://github.com/danmar/cppcheck
This commit is contained in:
commit
bc0524dec3
|
@ -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 ( )"))
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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())
|
||||||
|
|
|
@ -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"
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue