Skip to content

Commit 52f549f

Browse files
Fix crash on garbage code (#3834)
1 parent 9072182 commit 52f549f

2 files changed

Lines changed: 8 additions & 1 deletion

File tree

lib/tokenize.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4286,7 +4286,10 @@ void Tokenizer::setVarIdPass2()
42864286
while (Token::Match(tokStart, ":: %name%") || tokStart->str() == "<") {
42874287
if (tokStart->str() == "<") {
42884288
// skip the template part
4289-
tokStart = tokStart->findClosingBracket()->next();
4289+
const Token* closeTok = tokStart->findClosingBracket();
4290+
if (!closeTok)
4291+
syntaxError(tok);
4292+
tokStart = closeTok->next();
42904293
} else {
42914294
classnameTokens.push_back(tokStart->next());
42924295
tokStart = tokStart->tokAt(2);

test/testgarbage.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ class TestGarbage : public TestFixture {
250250
TEST_CASE(garbageCode218); // #8763
251251
TEST_CASE(garbageCode219); // #10101
252252
TEST_CASE(garbageCode220); // #6832
253+
TEST_CASE(garbageCode221);
253254

254255
TEST_CASE(garbageCodeFuzzerClientMode1); // test cases created with the fuzzer client, mode 1
255256

@@ -1704,6 +1705,9 @@ class TestGarbage : public TestFixture {
17041705
void garbageCode220() { // #6832
17051706
ASSERT_THROW(checkCode("(){(){{()}}return;{switch()0 case(){}break;l:()}}\n"), InternalError); // don't crash
17061707
}
1708+
void garbageCode221() {
1709+
ASSERT_THROW(checkCode("struct A<0<;\n"), InternalError); // don't crash
1710+
}
17071711

17081712
void syntaxErrorFirstToken() {
17091713
ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818

0 commit comments

Comments
 (0)