From 8878e6dd0d1fe5b54d63819456c5f169dcb44ec9 Mon Sep 17 00:00:00 2001 From: Simon Martin Date: Thu, 18 Jan 2018 08:51:35 +0100 Subject: [PATCH] Ticket #8333: Properly report a syntax error for functions with invalid parameter types. (#1030) --- lib/symboldatabase.cpp | 4 ++++ test/testgarbage.cpp | 12 +++++++++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index bfc3fd02f..92b304b00 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -3082,6 +3082,10 @@ void Function::addArguments(const SymbolDatabase *symbolDatabase, const Scope *s // skip over stuff to get to type while (Token::Match(typeTok, "const|enum|struct|::")) typeTok = typeTok->next(); + if (Token::Match(typeTok, ",|)")) { // #8333 + symbolDatabase->_tokenizer->syntaxError(typeTok); + return; + } // skip over qualification while (Token::Match(typeTok, "%type% ::")) typeTok = typeTok->tokAt(2); diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index 9ecb97296..185e82236 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -221,6 +221,7 @@ private: TEST_CASE(garbageCode188); TEST_CASE(garbageCode189); // #8317 TEST_CASE(garbageCode190); // #8307 + TEST_CASE(garbageCode191); // #8333 TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); TEST_CASE(garbageAST); @@ -1203,7 +1204,7 @@ private: "{\n" " (foo(s, , 2, , , 5, , 7)) abort()\n" "}\n"; - checkCode(code); + ASSERT_THROW(checkCode(code), InternalError); // #6106 code = " f { int i ; b2 , [ ] ( for ( i = 0 ; ; ) ) }"; @@ -1451,6 +1452,15 @@ private: "}"); } + void garbageCode191() { // #8333 + ASSERT_THROW(checkCode("struct A { int f(const); };"), InternalError); + ASSERT_THROW(checkCode("struct A { int f(int, const, char); };"), InternalError); + ASSERT_THROW(checkCode("struct A { int f(struct); };"), InternalError); + + // The following code is valid and should not trigger any error + checkCode("struct A { int f ( char ) ; } ;"); + } + void syntaxErrorFirstToken() { ASSERT_THROW(checkCode("&operator(){[]};"), InternalError); // #7818 ASSERT_THROW(checkCode("*(*const<> (size_t); foo) { } *(*const (size_t)() ; foo) { }"), InternalError); // #6858