From 454d4573b4d607687cdc7b04be45b9b4c063b07e Mon Sep 17 00:00:00 2001 From: Alexander Mai Date: Tue, 2 Jun 2015 20:15:21 +0200 Subject: [PATCH] #6742 segmentation fault (invalid code) in SymbolDatabase::SymbolDatabase. Fix in Type::initBaseInfo() --- lib/symboldatabase.cpp | 5 ++++- test/testgarbage.cpp | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/symboldatabase.cpp b/lib/symboldatabase.cpp index d3792f2a9..35ca24485 100644 --- a/lib/symboldatabase.cpp +++ b/lib/symboldatabase.cpp @@ -1962,7 +1962,8 @@ const Token *Type::initBaseInfo(const Token *tok, const Token *tok1) } base.nameTok = tok2; - + if (!tok2) + return nullptr; // handle global namespace if (tok2->str() == "::") { tok2 = tok2->next(); @@ -1972,6 +1973,8 @@ const Token *Type::initBaseInfo(const Token *tok, const Token *tok1) while (Token::Match(tok2, "%name% ::")) { tok2 = tok2->tokAt(2); } + if (!tok2) + return nullptr; base.name = tok2->str(); diff --git a/test/testgarbage.cpp b/test/testgarbage.cpp index d0b7ad1fe..9b7e9b452 100644 --- a/test/testgarbage.cpp +++ b/test/testgarbage.cpp @@ -104,6 +104,7 @@ private: TEST_CASE(garbageCode63); TEST_CASE(garbageCode64); TEST_CASE(garbageCode65); + TEST_CASE(garbageCode66); TEST_CASE(garbageValueFlow); TEST_CASE(garbageSymbolDatabase); @@ -585,6 +586,10 @@ private: ASSERT_THROW(checkCode("{ } { } typedef int u_array[]; typedef u_array &u_array_ref; (u_array_ref arg) { } u_array_ref"), InternalError); } + void garbageCode66() { // #6742 + ASSERT_THROW(checkCode("{ { } }; { { } }; { }; class bar : public virtual"), InternalError); + } + void garbageValueFlow() { // #6089