Fix ticket #351 (false positive::resource leak)
http://apps.sourceforge.net/trac/cppcheck/ticket/351
This commit is contained in:
parent
95c9fe5d20
commit
3428584925
|
@ -1723,6 +1723,17 @@ bool Tokenizer::simplifyConditions()
|
|||
|
||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||
{
|
||||
if (Token::Match(tok, "! %num%") || Token::Match(tok, "! %bool%"))
|
||||
{
|
||||
if (tok->next()->str() == "0" || tok->next()->str() == "false")
|
||||
tok->str("true");
|
||||
else
|
||||
tok->str("false");
|
||||
|
||||
tok->deleteNext();
|
||||
ret = true;
|
||||
}
|
||||
|
||||
if (Token::simpleMatch(tok, "( true &&") || Token::simpleMatch(tok, "&& true &&") || Token::simpleMatch(tok->next(), "&& true )"))
|
||||
{
|
||||
tok->deleteNext();
|
||||
|
@ -2354,7 +2365,7 @@ bool Tokenizer::simplifyKnownVariables()
|
|||
break;
|
||||
|
||||
// Using the variable in condition..
|
||||
if (Token::Match(tok3, "(|==|!=|<|<=|>|>= %varid% )|==|!=|<|<=|>|>=", varid))
|
||||
if (Token::Match(tok3, "(|!|==|!=|<|<=|>|>= %varid% )|==|!=|<|<=|>|>=", varid))
|
||||
{
|
||||
tok3 = tok3->next();
|
||||
tok3->str(value.c_str());
|
||||
|
|
|
@ -480,24 +480,47 @@ private:
|
|||
|
||||
void simplifyKnownVariables1()
|
||||
{
|
||||
const char code[] = "void f()\n"
|
||||
"{\n"
|
||||
" int a = 10;\n"
|
||||
" if (a);\n"
|
||||
"}\n";
|
||||
{
|
||||
const char code[] = "void f()\n"
|
||||
"{\n"
|
||||
" int a = 10;\n"
|
||||
" if (a);\n"
|
||||
"}\n";
|
||||
|
||||
// tokenize..
|
||||
OurTokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
// tokenize..
|
||||
OurTokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyKnownVariables();
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyKnownVariables();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int a ; a = 10 ; if ( 10 ) ; }", ostr.str());
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int a ; a = 10 ; if ( 10 ) ; }", ostr.str());
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] = "void f()\n"
|
||||
"{\n"
|
||||
" int a = 10;\n"
|
||||
" if (!a);\n"
|
||||
"}\n";
|
||||
|
||||
// tokenize..
|
||||
OurTokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyKnownVariables();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int a ; a = 10 ; if ( ! 10 ) ; }", ostr.str());
|
||||
}
|
||||
}
|
||||
|
||||
void simplifyKnownVariables2()
|
||||
|
@ -1702,27 +1725,101 @@ private:
|
|||
|
||||
void simplify_numeric_condition()
|
||||
{
|
||||
const char code[] =
|
||||
"void f()\n"
|
||||
"{\n"
|
||||
"int x = 0;\n"
|
||||
"if( !x || 0 )\n"
|
||||
"{\n"
|
||||
"}\n"
|
||||
"}";
|
||||
{
|
||||
const char code[] =
|
||||
"void f()\n"
|
||||
"{\n"
|
||||
"int x = 0;\n"
|
||||
"if( !x || 0 )\n"
|
||||
"{ g();\n"
|
||||
"}\n"
|
||||
"}";
|
||||
|
||||
// tokenize..
|
||||
Tokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
// tokenize..
|
||||
Tokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyTokenList();
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyTokenList();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int x ; x = 0 ; if ( ! x ) { } }", ostr.str());
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int x ; x = 0 ; { g ( ) ; } }", ostr.str());
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f()\n"
|
||||
"{\n"
|
||||
"int x = 1;\n"
|
||||
"if( !x )\n"
|
||||
"{ g();\n"
|
||||
"}\n"
|
||||
"}";
|
||||
|
||||
// tokenize..
|
||||
Tokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyTokenList();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { int x ; x = 1 ; }", ostr.str());
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f()\n"
|
||||
"{\n"
|
||||
"bool x = true;\n"
|
||||
"if( !x )\n"
|
||||
"{ g();\n"
|
||||
"}\n"
|
||||
"}";
|
||||
|
||||
// tokenize..
|
||||
Tokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyTokenList();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { bool x ; x = true ; }", ostr.str());
|
||||
}
|
||||
|
||||
{
|
||||
const char code[] =
|
||||
"void f()\n"
|
||||
"{\n"
|
||||
"bool x = false;\n"
|
||||
"if( !x )\n"
|
||||
"{ g();\n"
|
||||
"}\n"
|
||||
"}";
|
||||
|
||||
// tokenize..
|
||||
Tokenizer tokenizer;
|
||||
std::istringstream istr(code);
|
||||
tokenizer.tokenize(istr, "test.cpp");
|
||||
|
||||
tokenizer.setVarId();
|
||||
tokenizer.simplifyTokenList();
|
||||
|
||||
std::ostringstream ostr;
|
||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||
ostr << " " << tok->str();
|
||||
ASSERT_EQUALS(" void f ( ) { bool x ; x = false ; { g ( ) ; } }", ostr.str());
|
||||
}
|
||||
}
|
||||
|
||||
void tokenize_double()
|
||||
|
|
Loading…
Reference in New Issue