Fixed #8018: Tokenize::findGarbageCode: detect heads of for-loops with 1 or more than 2 semicolons as garbage code.
This commit is contained in:
parent
19ce65217e
commit
cee0f724ff
|
@ -8133,6 +8133,27 @@ const Token * Tokenizer::findGarbageCode() const
|
|||
}
|
||||
}
|
||||
|
||||
for (const Token *tok = tokens(); tok ; tok = tok->next()) {
|
||||
if (!Token::simpleMatch(tok, "for (")) // find for loops
|
||||
continue;
|
||||
// count number of semicolons
|
||||
unsigned int semicolons = 0;
|
||||
const Token* const startTok = tok;
|
||||
tok = tok->next()->link()->previous(); // find ")" of the for-loop
|
||||
// walk backwards until we find the beginning (startTok) of the for() again
|
||||
for (; tok != startTok; tok = tok->previous()) {
|
||||
if (tok->str() == ";") { // do the counting
|
||||
semicolons++;
|
||||
} else if (tok->str() == ")") { // skip pairs of ( )
|
||||
tok = tok->link();
|
||||
}
|
||||
}
|
||||
// if we have an invalid number of semicolons inside for( ), assume syntax error
|
||||
if ((semicolons == 1) || (semicolons > 2)) {
|
||||
return tok;
|
||||
}
|
||||
}
|
||||
|
||||
// Code must not start with an arithmetical operand
|
||||
if (Token::Match(list.front(), "%cop%"))
|
||||
return list.front();
|
||||
|
|
|
@ -1035,7 +1035,8 @@ private:
|
|||
}
|
||||
|
||||
void garbageCode136() { // #7033
|
||||
checkCode("{ } () { void f() { node_t * n; for (; -n) {} } } { }");
|
||||
ASSERT_THROW(checkCode("{ } () { void f() { node_t * n; for (; -n) {} } } { }"),
|
||||
InternalError);
|
||||
}
|
||||
|
||||
void garbageCode137() { // #7034
|
||||
|
@ -1326,7 +1327,7 @@ private:
|
|||
|
||||
void garbageCode165() {
|
||||
//7235
|
||||
checkCode("for(;..)", false);
|
||||
ASSERT_THROW(checkCode("for(;..)", false),InternalError);
|
||||
}
|
||||
|
||||
void garbageCode167() {
|
||||
|
|
Loading…
Reference in New Issue