Bug 412410

Summary: Segfault when mouse over on a typedef
Product: [Applications] kdevelop Reporter: TheComet <alex.murray>
Component: Language Support: CPP (Clang-based)Assignee: kdevelop-bugs-null
Status: REPORTED ---    
Severity: normal CC: astitcher, deadmaxfr
Priority: NOR    
Version First Reported In: 5.4.2   
Target Milestone: ---   
Platform: Other   
OS: Linux   
Latest Commit: Version Fixed/Implemented In:
Sentry Crash Report:
Attachments: proposed workaround

Description TheComet 2019-09-27 22:21:59 UTC
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
Comment 1 Andrew Stitcher 2019-10-18 17:22:22 UTC
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!
Comment 2 Alexandre Martins 2020-01-02 07:41:18 UTC
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
Comment 3 Alexandre Martins 2020-01-02 08:04:28 UTC
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
Comment 4 Alexandre Martins 2020-01-02 09:40:50 UTC
Created attachment 124845 [details]
proposed workaround

I made a workaround for this crash.

The idea is to detect the infinite loop in type alias.