Skip to content

Commit 2c656d6

Browse files
Ken-Patrickdanmar
authored andcommitted
Issue 9255: Prevent infinite recursion in parsedecl (#2134)
1 parent 9ef64eb commit 2c656d6

2 files changed

Lines changed: 23 additions & 1 deletion

File tree

lib/symboldatabase.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5271,6 +5271,7 @@ void SymbolDatabase::setValueType(Token *tok, const ValueType &valuetype)
52715271

52725272
static const Token * parsedecl(const Token *type, ValueType * const valuetype, ValueType::Sign defaultSignedness, const Settings* settings)
52735273
{
5274+
const Token * const previousType = type;
52745275
const unsigned int pointer0 = valuetype->pointer;
52755276
while (Token::Match(type->previous(), "%name%"))
52765277
type = type->previous();
@@ -5305,7 +5306,7 @@ static const Token * parsedecl(const Token *type, ValueType * const valuetype, V
53055306
valuetype->sign = ValueType::Sign::UNSIGNED;
53065307
if (valuetype->type == ValueType::Type::UNKNOWN_TYPE &&
53075308
type->type() && type->type()->isTypeAlias() && type->type()->typeStart &&
5308-
type->type()->typeStart->str() != type->str())
5309+
type->type()->typeStart->str() != type->str() && type->type()->typeStart != previousType)
53095310
parsedecl(type->type()->typeStart, valuetype, defaultSignedness, settings);
53105311
else if (type->str() == "const")
53115312
valuetype->constness |= (1 << (valuetype->pointer - pointer0));

test/testsymboldatabase.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,6 +396,8 @@ class TestSymbolDatabase: public TestFixture {
396396
TEST_CASE(auto12); // #8993 - const std::string &x; auto y = x; if (y.empty()) ..
397397

398398
TEST_CASE(unionWithConstructor);
399+
400+
TEST_CASE(incomplete_type); // #9255 (infinite recursion)
399401
}
400402

401403
void array() {
@@ -7073,6 +7075,25 @@ class TestSymbolDatabase: public TestFixture {
70737075
f = Token::findsimplematch(tokenizer.tokens(), "Fred ( float");
70747076
ASSERT_EQUALS(true, db && f && f->function() && f->function()->tokenDef->linenr() == 3);
70757077
}
7078+
7079+
void incomplete_type() {
7080+
GET_SYMBOL_DB("template<class _Ty,\n"
7081+
" class _Alloc = std::allocator<_Ty>>\n"
7082+
" class SLSurfaceLayerData\n"
7083+
" : public _Vector_alloc<_Vec_base_types<_Ty, _Alloc>>\n"
7084+
"{ // varying size array of values\n"
7085+
"\n"
7086+
" using reverse_iterator = _STD reverse_iterator<iterator>;\n"
7087+
" using const_reverse_iterator = _STD reverse_iterator<const_iterator>;\n"
7088+
" const_reverse_iterator crend() const noexcept\n"
7089+
" { // return iterator for end of reversed nonmutable sequence\n"
7090+
" return (rend());\n"
7091+
" }\n"
7092+
"};");
7093+
(void)db;
7094+
7095+
ASSERT_EQUALS("", errout.str());
7096+
}
70767097
};
70777098

70787099
REGISTER_TEST(TestSymbolDatabase)

0 commit comments

Comments
 (0)