fix #2739 (segmentation fault of cppcheck ( if()x ))

This commit is contained in:
Robert Reif 2011-06-11 15:51:12 -04:00
parent 6c725a685c
commit 5e3263235b
3 changed files with 28 additions and 6 deletions

View File

@ -2163,7 +2163,9 @@ bool Tokenizer::tokenize(std::istream &code,
labels();
simplifyDoWhileAddBraces();
simplifyIfAddBraces();
if (!simplifyIfAddBraces())
return false;
// Combine "- %num%" ..
for (Token *tok = _tokens; tok; tok = tok->next())
@ -4852,7 +4854,7 @@ void Tokenizer::removeRedundantSemicolons()
}
void Tokenizer::simplifyIfAddBraces()
bool Tokenizer::simplifyIfAddBraces()
{
for (Token *tok = _tokens; tok; tok = tok ? tok->next() : NULL)
{
@ -4894,10 +4896,13 @@ void Tokenizer::simplifyIfAddBraces()
continue;
}
// If there is no code after he if(), abort
// If there is no code after the if(), abort
if (!tok->next())
return;
{
// This is a syntax error and we should call syntaxError() and return false but
// many tokenizer tests are written with this syntax error so just ingore it.
return true;
}
// insert open brace..
tok->insertToken("{");
@ -4967,7 +4972,15 @@ void Tokenizer::simplifyIfAddBraces()
tempToken->insertToken("}");
Token::createMutualLinks(tok, tempToken->next());
}
else
{
// Can't insert matching "}" so give up. This is fatal because it
// causes unbalanced braces.
syntaxError(tok);
return false;
}
}
return true;
}
bool Tokenizer::simplifyDoWhileAddBracesHelper(Token *tok)

View File

@ -284,8 +284,9 @@ public:
void simplifyComma();
/** Add braces to an if-block
* @return true if no syntax errors
*/
void simplifyIfAddBraces();
bool simplifyIfAddBraces();
/**
* Add braces to an do-while block

View File

@ -337,6 +337,8 @@ private:
// a = b = 0;
TEST_CASE(multipleAssignment);
TEST_CASE(simplifyIfAddBraces); // ticket # 2739 (segmentation fault)
}
@ -5611,6 +5613,12 @@ private:
{
ASSERT_EQUALS("a = b = 0 ;", tokenizeAndStringify("a=b=0;"));
}
void simplifyIfAddBraces() // ticket # 2739 (segmentation fault)
{
tokenizeAndStringify("if()x");
ASSERT_EQUALS("[test.cpp:1]: (error) syntax error\n", errout.str());
}
};
REGISTER_TEST(TestTokenizer)