Fix ticket #342 (Simplify "if( (true) == true )")
http://apps.sourceforge.net/trac/cppcheck/ticket/342
This commit is contained in:
parent
a015704591
commit
8876f0ee57
112
src/tokenize.cpp
112
src/tokenize.cpp
|
@ -1744,28 +1744,54 @@ bool Tokenizer::simplifyConditions()
|
||||||
if (! tok4)
|
if (! tok4)
|
||||||
break;
|
break;
|
||||||
if ((tok->str() == "&&" || tok->str() == "||" || tok->str() == "(") &&
|
if ((tok->str() == "&&" || tok->str() == "||" || tok->str() == "(") &&
|
||||||
Token::Match(tok->tokAt(1), "%num% %any% %num%") &&
|
(Token::Match(tok->tokAt(1), "%num% %any% %num%") ||
|
||||||
|
Token::Match(tok->tokAt(1), "%bool% %any% %bool%")) &&
|
||||||
(tok4->str() == "&&" || tok4->str() == "||" || tok4->str() == ")"))
|
(tok4->str() == "&&" || tok4->str() == "||" || tok4->str() == ")"))
|
||||||
{
|
{
|
||||||
double op1 = (strstr(tok->strAt(1), "0x")) ? std::strtol(tok->strAt(1), 0, 16) : std::atof(tok->strAt(1));
|
|
||||||
double op2 = (strstr(tok->strAt(3), "0x")) ? std::strtol(tok->strAt(3), 0, 16) : std::atof(tok->strAt(3));
|
|
||||||
std::string cmp = tok->strAt(2);
|
std::string cmp = tok->strAt(2);
|
||||||
|
|
||||||
bool result = false;
|
bool result = false;
|
||||||
if (cmp == "==")
|
if (Token::Match(tok->tokAt(1), "%num%"))
|
||||||
result = (op1 == op2);
|
{
|
||||||
else if (cmp == "!=")
|
// Compare numbers
|
||||||
result = (op1 != op2);
|
double op1 = (strstr(tok->strAt(1), "0x")) ? std::strtol(tok->strAt(1), 0, 16) : std::atof(tok->strAt(1));
|
||||||
else if (cmp == ">=")
|
double op2 = (strstr(tok->strAt(3), "0x")) ? std::strtol(tok->strAt(3), 0, 16) : std::atof(tok->strAt(3));
|
||||||
result = (op1 >= op2);
|
|
||||||
else if (cmp == ">")
|
if (cmp == "==")
|
||||||
result = (op1 > op2);
|
result = (op1 == op2);
|
||||||
else if (cmp == "<=")
|
else if (cmp == "!=")
|
||||||
result = (op1 <= op2);
|
result = (op1 != op2);
|
||||||
else if (cmp == "<")
|
else if (cmp == ">=")
|
||||||
result = (op1 < op2);
|
result = (op1 >= op2);
|
||||||
|
else if (cmp == ">")
|
||||||
|
result = (op1 > op2);
|
||||||
|
else if (cmp == "<=")
|
||||||
|
result = (op1 <= op2);
|
||||||
|
else if (cmp == "<")
|
||||||
|
result = (op1 < op2);
|
||||||
|
else
|
||||||
|
cmp = "";
|
||||||
|
}
|
||||||
else
|
else
|
||||||
cmp = "";
|
{
|
||||||
|
// Compare boolean
|
||||||
|
bool op1 = (tok->strAt(1) == std::string("true"));
|
||||||
|
bool op2 = (tok->strAt(3) == std::string("true"));
|
||||||
|
|
||||||
|
if (cmp == "==")
|
||||||
|
result = (op1 == op2);
|
||||||
|
else if (cmp == "!=")
|
||||||
|
result = (op1 != op2);
|
||||||
|
else if (cmp == ">=")
|
||||||
|
result = (op1 >= op2);
|
||||||
|
else if (cmp == ">")
|
||||||
|
result = (op1 > op2);
|
||||||
|
else if (cmp == "<=")
|
||||||
|
result = (op1 <= op2);
|
||||||
|
else if (cmp == "<")
|
||||||
|
result = (op1 < op2);
|
||||||
|
else
|
||||||
|
cmp = "";
|
||||||
|
}
|
||||||
|
|
||||||
if (! cmp.empty())
|
if (! cmp.empty())
|
||||||
{
|
{
|
||||||
|
@ -2387,36 +2413,40 @@ bool Tokenizer::elseif()
|
||||||
|
|
||||||
bool Tokenizer::simplifyRedundantParanthesis()
|
bool Tokenizer::simplifyRedundantParanthesis()
|
||||||
{
|
{
|
||||||
|
if (!createLinks())
|
||||||
|
return false;
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
for (Token *tok = _tokens; tok; tok = tok->next())
|
for (Token *tok = _tokens; tok; tok = tok->next())
|
||||||
{
|
{
|
||||||
bool foundSomething = true;
|
if (tok->str() != "(")
|
||||||
while (foundSomething && Token::simpleMatch(tok, "( ("))
|
continue;
|
||||||
|
|
||||||
|
while (Token::simpleMatch(tok, "( (") &&
|
||||||
|
tok->link()->previous() == tok->next()->link())
|
||||||
{
|
{
|
||||||
foundSomething = false;
|
// We have "(( *something* ))", remove the inner
|
||||||
int parlevel = 0;
|
// paranthesis
|
||||||
|
tok->deleteNext();
|
||||||
|
tok->link()->previous()->previous()->deleteNext();
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
for (Token *tok2 = tok; tok2; tok2 = tok2->next())
|
if (Token::Match(tok, "( ( %bool% )") ||
|
||||||
{
|
Token::Match(tok, "( ( %num% )"))
|
||||||
if (tok2->str() == "(")
|
{
|
||||||
++parlevel;
|
tok->tokAt(2)->deleteNext();
|
||||||
|
tok->deleteNext();
|
||||||
|
ret = true;
|
||||||
|
}
|
||||||
|
|
||||||
else if (tok2->str() == ")")
|
if (Token::Match(tok, "( %bool% ) )") ||
|
||||||
{
|
Token::Match(tok, "( %num% ) )"))
|
||||||
--parlevel;
|
{
|
||||||
if (parlevel == 1)
|
tok = tok->next();
|
||||||
{
|
tok->deleteNext();
|
||||||
if (Token::simpleMatch(tok2, ") )"))
|
tok->previous()->deleteThis();
|
||||||
{
|
ret = true;
|
||||||
tok->deleteNext();
|
|
||||||
tok2->deleteNext();
|
|
||||||
ret = true;
|
|
||||||
foundSomething = true;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1616,22 +1616,43 @@ private:
|
||||||
|
|
||||||
void removeParantheses3()
|
void removeParantheses3()
|
||||||
{
|
{
|
||||||
const char code[] = "void foo()\n"
|
{
|
||||||
"{\n"
|
const char code[] = "void foo()\n"
|
||||||
" if (( true )==true){}\n"
|
"{\n"
|
||||||
"}";
|
" if (( true )==(true)){}\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
// tokenize..
|
// tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
tokenizer.simplifyTokenList();
|
tokenizer.simplifyTokenList();
|
||||||
|
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
ostr << " " << tok->str();
|
ostr << " " << tok->str();
|
||||||
TODO_ASSERT_EQUALS(std::string(" void foo ( ) { { } }"), ostr.str());
|
ASSERT_EQUALS(std::string(" void foo ( ) { { } }"), ostr.str());
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const char code[] = "void foo()\n"
|
||||||
|
"{\n"
|
||||||
|
" if (( 2 )==(2)){}\n"
|
||||||
|
"}";
|
||||||
|
|
||||||
|
// tokenize..
|
||||||
|
Tokenizer tokenizer;
|
||||||
|
std::istringstream istr(code);
|
||||||
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
|
tokenizer.simplifyTokenList();
|
||||||
|
|
||||||
|
std::ostringstream ostr;
|
||||||
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
|
ostr << " " << tok->str();
|
||||||
|
ASSERT_EQUALS(std::string(" void foo ( ) { { } }"), ostr.str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void simplify_numeric_condition()
|
void simplify_numeric_condition()
|
||||||
|
|
Loading…
Reference in New Issue