SUMMARY KDevelop will crash when hovering the mouse over a typedef'd forward declared struct. STEPS TO REPRODUCE 1) Add foo.h header file to project with following content: typedef struct foo foo; void bar(foo* bla); 2) hover your mouse over the type "foo". OBSERVED RESULT KDevelop segfaults. GDB backtrace: #0 0x00007ffff6edf7fe in KDevelop::PersistentSymbolTable::declarations(KDevelop::IndexedQualifiedIdentifier const&) const () from /usr/lib64/libKDevPlatformLanguage.so.54 #1 0x00007ffff6ee17f4 in KDevelop::PersistentSymbolTable::filteredDeclarations(KDevelop::IndexedQualifiedIdentifier const&, Utils::StorableSet<KDevelop::IndexedTopDUContext, KDevelop::IndexedTopDUContextIndexConversion, KDevelop::RecursiveImportRepository, true, Utils::DummyLocker> const&) const () from /usr/lib64/libKDevPlatformLanguage.so.54 #2 0x00007ffff6ef32c7 in KDevelop::DeclarationId::declaration(KDevelop::TopDUContext const*, bool) const () from /usr/lib64/libKDevPlatformLanguage.so.54 #3 0x00007ffff6e58da0 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #4 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #5 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #6 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #7 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #8 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #9 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #10 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #11 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #12 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #13 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #14 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #15 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #16 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #17 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #18 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #19 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #20 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #21 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #22 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #23 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 #24 0x00007ffff6e58db9 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () from /usr/lib64/libKDevPlatformLanguage.so.54 etc... Looks like a stack overflow, as there are tens of thousands of the same function. EXPECTED RESULT It shouldn't crash! SOFTWARE/OS VERSIONS I'm using dev-util/kdevelop-5.4.1 from Gentoo's package manager. 4.19.66-gentoo #1 SMP Mon Aug 26 14:56:58 CEST 2019 x86_64 AMD Ryzen Threadripper 1950X 16-Core Processor AuthenticAMD GNU/Linux
I can confirm this bug in version 5.4.2 running the distribution packages for Fedora 30. It is a very annoying bug for my development as our C codebase uses typedef struct blah blah; extensively so I have to restart kdevelop frequently!
Please note that the end of the backtrace look like that: #47575 0x00007ffff518bf5e in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47576 0x00007ffff518bf5e in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47577 0x00007ffff518bf5e in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47578 0x00007ffff518bf5e in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47579 0x00007ffff518bf5e in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47580 0x00007ffff51911f5 in KDevelop::AbstractDeclarationNavigationContext::html(bool) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47581 0x00007ffff517b830 in KDevelop::AbstractNavigationWidget::update() () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47582 0x00007ffff517bff5 in KDevelop::AbstractNavigationWidget::setContext(QExplicitlySharedDataPointer<KDevelop::AbstractNavigationContext>, int) () at /lib/x86_64-linux-gnu/libKDevPlatformLanguage.so.54 #47583 0x00007fffc2980a2f in ClangNavigationWidget::ClangNavigationWidget(KDevelop::DUChainPointer<KDevelop::Declaration> const&, QFlags<KDevelop::AbstractNavigationWidget::DisplayHint>) () at /lib/x86_64-linux-gnu/libKDevClangPrivate.so.32 #47584 0x00007fffc29600c5 in () at /lib/x86_64-linux-gnu/libKDevClangPrivate.so.32 #47585 0x00007fffe042b27e in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47586 0x00007fffe042be9c in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47587 0x00007fffe042c7e2 in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47588 0x00007ffff49bbe9c in () at /lib/x86_64-linux-gnu/libKF5TextEditor.so.5 #47589 0x00007ffff4ab3e62 in () at /lib/x86_64-linux-gnu/libKF5TextEditor.so.5 #47590 0x00007ffff670d468 in QMetaObject::activate(QObject*, int, int, void**) () at /lib/x86_64-linux-gnu/libQt5Core.so.5 #47591 0x00007ffff671a66b in QTimer::timeout(QTimer::QPrivateSignal) () at /lib/x86_64-linux-gnu/libQt5Core.so.5 #47592 0x00007ffff670de55 in QObject::event(QEvent*) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
With debug symbols: #47576 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47577 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47578 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47579 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47580 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47581 0x00007ffff51084f8 in KDevelop::AbstractDeclarationNavigationContext::declarationSizeInformation(KDevelop::DUChainPointer<KDevelop::Declaration> const&, KDevelop::TopDUContext const*) (decl=..., topContext=0x5555594391e0) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:871 #47582 0x00007ffff51028e0 in KDevelop::AbstractDeclarationNavigationContext::html(bool) (this=0x55555e29b4c0, shorten=false) at ./kdevplatform/language/duchain/navigation/abstractdeclarationnavigationcontext.cpp:361 #47583 0x00007ffff50f405d in KDevelop::AbstractNavigationWidget::update() (this=0x55555e108d50) at ./kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp:199 #47584 0x00007ffff50f3cc0 in KDevelop::AbstractNavigationWidget::setContext(QExplicitlySharedDataPointer<KDevelop::AbstractNavigationContext>, int) (this=0x55555e108d50, context=..., initBrows=400) at ./kdevplatform/language/duchain/navigation/abstractnavigationwidget.cpp:159 #47585 0x00007fffbb4b9a2f in ClangNavigationWidget::ClangNavigationWidget(KDevelop::DUChainPointer<KDevelop::Declaration> const&, QFlags<KDevelop::AbstractNavigationWidget::DisplayHint>) () at /lib/x86_64-linux-gnu/libKDevClangPrivate.so.32 #47586 0x00007fffbb4990c5 in () at /lib/x86_64-linux-gnu/libKDevClangPrivate.so.32 #47587 0x00007fffe00ce27e in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47588 0x00007fffe00cee9c in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47589 0x00007fffe00cf7e2 in () at /usr/lib/x86_64-linux-gnu/qt5/plugins/kdevplatform/32/kdevcontextbrowser.so #47590 0x00007ffff48f7e9c in () at /lib/x86_64-linux-gnu/libKF5TextEditor.so.5 #47591 0x00007ffff49efe62 in () at /lib/x86_64-linux-gnu/libKF5TextEditor.so.5 #47592 0x00007ffff670b468 in QMetaObject::activate(QObject*, int, int, void**) () at /lib/x86_64-linux-gnu/libQt5Core.so.5
Created attachment 124845 [details] proposed workaround I made a workaround for this crash. The idea is to detect the infinite loop in type alias.