diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index da06ee156..2d9e5569e 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2341,7 +2341,11 @@ static bool setVarIdParseDeclaration(const Token **tok, const std::map 0) || Token::simpleMatch(tok2, "< >") /* Ticket #4764 */)) { - tok2 = tok2->findClosingBracket(); + const Token * tok3 = tok2->findClosingBracket(); + if (tok3 == nullptr) { /* Ticket #8151 */ + throw tok2; + } + tok2 = tok3; if (tok2->str() != ">") break; singleNameCount = 1; @@ -2694,7 +2698,12 @@ void Tokenizer::setVarIdPass1() if (!isC() && Token::simpleMatch(tok2, "const new")) continue; - bool decl = setVarIdParseDeclaration(&tok2, variableId, scopeStack.top().isExecutable, isCPP(), isC()); + bool decl; + try { /* Ticket #8151 */ + decl = setVarIdParseDeclaration(&tok2, variableId, scopeStack.top().isExecutable, isCPP(), isC()); + } catch (const Token * errTok) { + syntaxError(errTok); + } if (decl) { const Token* prev2 = tok2->previous(); if (Token::Match(prev2, "%type% [;[=,)]") && tok2->previous()->str() != "const") diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index fcc7c8a5a..a04b5333a 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -216,6 +216,7 @@ private: TEST_CASE(garbageCode183); // #7505 TEST_CASE(garbageCode184); // #7699 TEST_CASE(garbageCode185); // #6011 + TEST_CASE(garbageCode186); // #8151 TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); TEST_CASE(garbageAST); @@ -1419,6 +1420,12 @@ private: "}\n"); } + // #8151 - segfault due to incorrect template syntax + void garbageCode186() { + ASSERT_THROW(checkCode("A<>C"), InternalError); + } + + void syntaxErrorFirstToken() { ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818 ASSERT_THROW(checkCode("*(*const<> (size_t); foo) { } *(*const (size_t)() ; foo) { }"), InternalError); // #6858