Really fix: #2376 (simplifyTypedef: upx-ucl)
This commit is contained in:
parent
d8da1ac390
commit
ad22aebf8c
151
lib/tokenize.cpp
151
lib/tokenize.cpp
|
@ -854,6 +854,65 @@ static Token *splitDefinitionFromTypedef(Token *tok)
|
||||||
return tok;
|
return tok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* This function is called when processing function related typedefs.
|
||||||
|
* If simplifyTypedef generates an "Internal Error" message and the
|
||||||
|
* code that generated it deals in some way with functions, then this
|
||||||
|
* fucntion will probably need to be extended to handle a new function
|
||||||
|
* related pattern */
|
||||||
|
static Token *processFunc(Token *tok2, bool inOperator)
|
||||||
|
{
|
||||||
|
if (tok2->next() && tok2->next()->str() != ")" &&
|
||||||
|
tok2->next()->str() != ",")
|
||||||
|
{
|
||||||
|
// skip over tokens for some types of canonicalization
|
||||||
|
if (Token::Match(tok2->next(), "( * %type% ) ("))
|
||||||
|
tok2 = tok2->tokAt(5)->link();
|
||||||
|
else if (Token::Match(tok2->next(), "* ( * %type% ) ("))
|
||||||
|
tok2 = tok2->tokAt(6)->link();
|
||||||
|
else if (Token::Match(tok2->next(), "* ( %type% [") &&
|
||||||
|
Token::Match(tok2->tokAt(4)->link(), "] ) ;|="))
|
||||||
|
tok2 = tok2->tokAt(4)->link()->next();
|
||||||
|
else if (Token::Match(tok2->next(), "* ( * %type% ("))
|
||||||
|
tok2 = tok2->tokAt(5)->link()->next();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (tok2->next()->str() == "(")
|
||||||
|
tok2 = tok2->next()->link();
|
||||||
|
else if (!inOperator && !Token::Match(tok2->next(), "[|>|;"))
|
||||||
|
{
|
||||||
|
tok2 = tok2->next();
|
||||||
|
|
||||||
|
while (Token::Match(tok2, "*|&") &&
|
||||||
|
!Token::Match(tok2->next(), ")|>"))
|
||||||
|
tok2 = tok2->next();
|
||||||
|
|
||||||
|
// skip over namespace
|
||||||
|
while (Token::Match(tok2, "%var% ::"))
|
||||||
|
tok2 = tok2->tokAt(2);
|
||||||
|
|
||||||
|
if (tok2->str() == "(" &&
|
||||||
|
tok2->link()->next()->str() == "(")
|
||||||
|
{
|
||||||
|
tok2 = tok2->link();
|
||||||
|
|
||||||
|
if (tok2->next()->str() == "(")
|
||||||
|
tok2 = tok2->next()->link();
|
||||||
|
}
|
||||||
|
|
||||||
|
// skip over typedef parameter
|
||||||
|
if (tok2->next()->str() == "(")
|
||||||
|
{
|
||||||
|
tok2 = tok2->next()->link();
|
||||||
|
|
||||||
|
if (tok2->next()->str() == "(")
|
||||||
|
tok2 = tok2->next()->link();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return tok2;
|
||||||
|
}
|
||||||
|
|
||||||
void Tokenizer::simplifyTypedef()
|
void Tokenizer::simplifyTypedef()
|
||||||
{
|
{
|
||||||
std::vector<Space> spaceInfo;
|
std::vector<Space> spaceInfo;
|
||||||
|
@ -1473,49 +1532,7 @@ void Tokenizer::simplifyTypedef()
|
||||||
tok2 = copyTokens(tok2, funcStart, funcEnd);
|
tok2 = copyTokens(tok2, funcStart, funcEnd);
|
||||||
|
|
||||||
if (!inCast)
|
if (!inCast)
|
||||||
{
|
tok2 = processFunc(tok2, inOperator);
|
||||||
if (tok2->next() && tok2->next()->str() != ")" &&
|
|
||||||
tok2->next()->str() != ",")
|
|
||||||
{
|
|
||||||
if (Token::Match(tok2->next(), "( * %type% ) ("))
|
|
||||||
tok2 = tok2->tokAt(5)->link();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
else if (!inOperator && !Token::Match(tok2->next(), "[|>|;"))
|
|
||||||
{
|
|
||||||
tok2 = tok2->next();
|
|
||||||
|
|
||||||
while (Token::Match(tok2, "*|&") &&
|
|
||||||
!Token::Match(tok2->next(), ")|>"))
|
|
||||||
tok2 = tok2->next();
|
|
||||||
|
|
||||||
// skip over namespace
|
|
||||||
while (Token::Match(tok2, "%var% ::"))
|
|
||||||
tok2 = tok2->tokAt(2);
|
|
||||||
|
|
||||||
if (tok2->str() == "(" &&
|
|
||||||
tok2->link()->next()->str() == "(")
|
|
||||||
{
|
|
||||||
tok2 = tok2->link();
|
|
||||||
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
}
|
|
||||||
|
|
||||||
// skip over typedef parameter
|
|
||||||
else if (tok2->next()->str() == "(")
|
|
||||||
{
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tok2->insertToken(")");
|
tok2->insertToken(")");
|
||||||
tok2 = tok2->next();
|
tok2 = tok2->next();
|
||||||
|
@ -1586,45 +1603,7 @@ void Tokenizer::simplifyTypedef()
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!inCast)
|
if (!inCast)
|
||||||
{
|
tok2 = processFunc(tok2, inOperator);
|
||||||
if (tok2->next() && tok2->next()->str() != ")" &&
|
|
||||||
tok2->next()->str() != ",")
|
|
||||||
{
|
|
||||||
if (Token::Match(tok2->next(), "( * %type% ) ("))
|
|
||||||
tok2 = tok2->tokAt(5)->link();
|
|
||||||
else if (Token::Match(tok2->next(), "* ( * %type% ) ("))
|
|
||||||
tok2 = tok2->tokAt(6)->link();
|
|
||||||
else if (Token::Match(tok2->next(), "* ( %type% [") &&
|
|
||||||
Token::Match(tok2->tokAt(4)->link(), "] ) ;|="))
|
|
||||||
tok2 = tok2->tokAt(4)->link()->next();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
else if (!inOperator && !Token::Match(tok2->next(), "[|>|;"))
|
|
||||||
{
|
|
||||||
tok2 = tok2->next();
|
|
||||||
|
|
||||||
while (Token::Match(tok2, "*|&") &&
|
|
||||||
!Token::Match(tok2->next(), ")|>"))
|
|
||||||
tok2 = tok2->next();
|
|
||||||
|
|
||||||
// skip over namespace
|
|
||||||
while (Token::Match(tok2, "%var% ::"))
|
|
||||||
tok2 = tok2->tokAt(2);
|
|
||||||
|
|
||||||
// skip over typedef parameter
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
{
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
|
|
||||||
if (tok2->next()->str() == "(")
|
|
||||||
tok2 = tok2->next()->link();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (needParen)
|
if (needParen)
|
||||||
{
|
{
|
||||||
|
@ -2290,14 +2269,10 @@ bool Tokenizer::tokenize(std::istream &code,
|
||||||
// typedef..
|
// typedef..
|
||||||
simplifyTypedef();
|
simplifyTypedef();
|
||||||
|
|
||||||
// Fix internal error by updating links (#2376)
|
// catch bad typedef canonicalization
|
||||||
// TODO: Remove this "createLinks". Make sure that the testcase
|
if (!validate())
|
||||||
// TestSimplifyTokens::simplifyTypedefFunction8
|
|
||||||
// doesn't fail.
|
|
||||||
if (!createLinks())
|
|
||||||
{
|
{
|
||||||
// Source has syntax errors, can't proceed
|
// Source has syntax errors, can't proceed
|
||||||
cppcheckError(0);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue