From cbf0b13b3e184cae49bb989a6e76d014e171e007 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Sat, 28 Oct 2017 07:39:35 +0200 Subject: [PATCH] Ticket #8255: Don't crash upon invalid code while checking conditions. --- lib/tokenize.cpp | 2 ++ test/testgarbage.cpp | 27 ++++++++++++++++----------- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index bc1a14490..cfd7c50d2 100755 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -8310,6 +8310,8 @@ const Token * Tokenizer::findGarbageCode() const for (const Token *tok = tokens(); tok; tok = tok->next()) { if (Token::Match(tok, "%cop% %or%|%oror%|/|%")) return tok; + if (Token::Match(tok, ";|(|[ %comp%")) + return tok; } // Code must not start with an arithmetical operand diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 99ed47433..f1bf42ce1 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -218,6 +218,7 @@ private: TEST_CASE(garbageCode185); // #6011 TEST_CASE(garbageCode186); // #8151 TEST_CASE(garbageCode187); + TEST_CASE(garbageCode188); TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); TEST_CASE(garbageAST); @@ -562,12 +563,12 @@ private: } void garbageCode36() { // #6334 - checkCode("{ } < class template < > , { = } ; class... >\n" - "struct Y { }\n" - "class Types { }\n" - "( X < int > \"uses template\" ) ( < ( ) \"uses ;" - "( int int ::primary \"uses template\" ) int double \"uses )" - "::primary , \"uses template\" ;\n"); + ASSERT_THROW(checkCode("{ } < class template < > , { = } ; class... >\n" + "struct Y { }\n" + "class Types { }\n" + "( X < int > \"uses template\" ) ( < ( ) \"uses ;" + "( int int ::primary \"uses template\" ) int double \"uses )" + "::primary , \"uses template\" ;\n"), InternalError); } void garbageCode37() { @@ -710,7 +711,7 @@ private: } void garbageCode77() { // #6755 - checkCode("void foo (int **p) { { { };>= } } unsigned *d = (b b--) --*d"); + ASSERT_THROW(checkCode("void foo (int **p) { { { };>= } } unsigned *d = (b b--) --*d"), InternalError); } void garbageCode78() { // #6756 @@ -823,7 +824,7 @@ private: } void garbageCode105() { // #6859 - checkCode("void foo (int i) { int a , for (a 1; a( < 4; a++) if (a) (b b++) (b);) n++; }"); + ASSERT_THROW(checkCode("void foo (int i) { int a , for (a 1; a( < 4; a++) if (a) (b b++) (b);) n++; }"), InternalError); } void garbageCode106() { // #6880 @@ -843,7 +844,7 @@ private: } void garbageCode110() { // #6902 "segmentation fault (invalid code) in CheckStl::string_c_str" - checkCode("( *const<> ( size_t ) ; foo ) { } * ( *const ( size_t ) ( ) ;> foo )< { }"); + ASSERT_THROW(checkCode("( *const<> ( size_t ) ; foo ) { } * ( *const ( size_t ) ( ) ;> foo )< { }"), InternalError); } void garbageCode111() { // #6907 @@ -866,7 +867,7 @@ private: } void garbageCode116() { // #5356 - checkCode("struct template struct B { }; B < 0 > b;"); + ASSERT_THROW(checkCode("struct template struct B { }; B < 0 > b;"), InternalError); } void garbageCode117() { // #6121 @@ -1097,7 +1098,7 @@ private: } void garbageCode144() { // #6865 - checkCode("template < typename > struct A { } ; template < typename > struct A < INVALID > : A < int[ > { }] ;"); + ASSERT_THROW(checkCode("template < typename > struct A { } ; template < typename > struct A < INVALID > : A < int[ > { }] ;"), InternalError); } void garbageCode146() { // #7081 @@ -1432,6 +1433,10 @@ private: ASSERT_THROW(checkCode(inp), InternalError); } + void garbageCode188() { // #8255 + ASSERT_THROW(checkCode("{z r(){(){for(;<(x);){if(0==0)}}}}"), InternalError); + } + void syntaxErrorFirstToken() { ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818 ASSERT_THROW(checkCode("*(*const<> (size_t); foo) { } *(*const (size_t)() ; foo) { }"), InternalError); // #6858