diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 689228f08..9321670be 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -7978,6 +7978,8 @@ void Tokenizer::simplifyComma() tok = tok->link()->next(); } + if (!tok) + syntaxError(nullptr); // invalid code like in #4195 if (Token::Match(tok, "(|[") || (tok->str() == "{" && tok->previous() && tok->previous()->str() == "=")) { tok = tok->link(); diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 0df5b7f3b..c5d7f8d32 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -230,6 +230,7 @@ private: TEST_CASE(garbageCode179); // #3533 TEST_CASE(garbageCode180); TEST_CASE(garbageCode181); + TEST_CASE(garbageCode182); // #4195 TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); TEST_CASE(garbageAST); @@ -1509,6 +1510,12 @@ private: void garbageCode181() { checkCode("int test() { int +; }"); } + + // #4195 - segfault for "enum { int f ( ) { return = } r = f ( ) ; }" + void garbageCode182() { + ASSERT_THROW(checkCode("enum { int f ( ) { return = } r = f ( ) ; }"), InternalError); + } + }; REGISTER_TEST(TestGarbage) diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index 6b725b99e..473667ca3 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -59,7 +59,6 @@ private: TEST_CASE(tokenize20); // replace C99 _Bool => bool TEST_CASE(tokenize21); // tokenize 0x0E-7 TEST_CASE(tokenize22); // special marker $ from preprocessor - TEST_CASE(tokenize24); // #4195 (segmentation fault) TEST_CASE(tokenize25); // #4239 (segmentation fault) TEST_CASE(tokenize26); // #4245 (segmentation fault) TEST_CASE(tokenize27); // #4525 (segmentation fault) @@ -745,11 +744,6 @@ private: ASSERT_EQUALS("$if ( ! p )", tokenizeAndStringify("$if(!p)")); } - // #4195 - segfault for "enum { int f ( ) { return = } r = f ( ) ; }" - void tokenize24() { - TODO_ASSERT_THROW(tokenizeAndStringify("enum { int f ( ) { return = } r = f ( ) ; }"), InternalError); - } - // #4239 - segfault for "f ( struct { int typedef T x ; } ) { }" void tokenize25() { tokenizeAndStringify("f ( struct { int typedef T x ; } ) { }");