Bug 376523

Summary: Assertion failure when discarding changes in Custom BuildSystem settings.
Product: [Applications] kdevelop Reporter: Francis Herne <mail>
Component: BuildSystem: Custom BuildSystemsAssignee: kdevelop-bugs-null
Status: RESOLVED FIXED    
Severity: crash    
Priority: NOR    
Version First Reported In: 5.1.0   
Target Milestone: ---   
Platform: Compiled Sources   
OS: Linux   
Latest Commit: Version Fixed In: 5.1.0
Sentry Crash Report:

Description Francis Herne 2017-02-15 23:16:45 UTC
Using recent 5.1 branches, compiled from source on Arch Linux:

 - Create a Custom BuildSystem project.
 - Go to Project -> Open Configuration -> Custom BuildSystem
 - Make some config change, but don't apply it.
 - Switch to another config page.
 - A dialog will appear asking whether to Apply or Discard changes.
 - Select 'Discard'.

KDevelop will crash with the following backtrace. This doesn't occur if selecting 'Apply', or with other build plugins (at least Make, CMake).

---------
ASSERT: "ui->currentConfig->count() == configs.count()" in file /home/flh/projects/kdevelop/projectmanagers/custom-buildsystem/custombuildsystemconfigwidget.cpp, line 196

Thread 1 "kdevelop" received signal SIGABRT, Aborted.
0x00007ffff02d904f in raise () from /usr/lib/libc.so.6
(gdb) bt
#0  0x00007ffff02d904f in raise () at /usr/lib/libc.so.6
#1  0x00007ffff02da47a in abort () at /usr/lib/libc.so.6
#2  0x00007ffff0f7ae21 in  () at /usr/lib/libQt5Core.so.5
#3  0x00007ffff0f763de in  () at /usr/lib/libQt5Core.so.5
#4  0x00007fffb3006cc9 in CustomBuildSystemConfigWidget::verify() (this=0x2aa8790) at /home/flh/projects/kdevelop/projectmanagers/custom-buildsystem/custombuildsystemconfigwidget.cpp:196
#5  0x00007fffb3009d85 in QtPrivate::FunctorCall<QtPrivate::IndexesList<>, QtPrivate::List<>, void, void (CustomBuildSystemConfigWidget::*)()>::call(void (CustomBuildSystemConfigWidget::*)(), CustomBuildSystemConfigWidget*, void**) (f=(void (CustomBuildSystemConfigWidget::*)(CustomBuildSystemConfigWidget * const)) 0x7fffb3006c7a <CustomBuildSystemConfigWidget::verify()>, o=0x2aa8790, arg=0x7fffffff9ae0) at /usr/include/qt/QtCore/qobjectdefs_impl.h:143
#6  0x00007fffb3009b4e in QtPrivate::FunctionPointer<void (CustomBuildSystemConfigWidget::*)()>::call<QtPrivate::List<>, void>(void (CustomBuildSystemConfigWidget::*)(), CustomBuildSystemConfigWidget*, void**) (f=(void (CustomBuildSystemConfigWidget::*)(CustomBuildSystemConfigWidget * const)) 0x7fffb3006c7a <CustomBuildSystemConfigWidget::verify()>, o=0x2aa8790, arg=0x7fffffff9ae0)
    at /usr/include/qt/QtCore/qobjectdefs_impl.h:162
#7  0x00007fffb300980d in QtPrivate::QSlotObject<void (CustomBuildSystemConfigWidget::*)(), QtPrivate::List<>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x2a5e810, r=0x2aa8790, a=0x7fffffff9ae0, ret=0x0) at /usr/include/qt/QtCore/qobject_impl.h:120
#8  0x00007ffff119b0be in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#9  0x00007fffb300b2c3 in CustomBuildSystemConfigWidget::changed() (this=0x2aa8790)
    at /home/flh/projects/kdevelop/build/projectmanagers/custom-buildsystem/kdevcustombuildsystem_automoc.dir/moc_custombuildsys_6N7SPIMYBDOOYP.cpp:156
#10 0x00007fffb3006df3 in CustomBuildSystemConfigWidget::renameCurrentConfig(QString const&) (this=0x2aa8790, name=...)
    at /home/flh/projects/kdevelop/projectmanagers/custom-buildsystem/custombuildsystemconfigwidget.cpp:212
#11 0x00007fffb3009e17 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0>, QtPrivate::List<QString const&>, void, void (CustomBuildSystemConfigWidget::*)(QString const&)>::call(void (CustomBuildSystemConfigWidget::*)(QString const&), CustomBuildSystemConfigWidget*, void**) (f=
    (void (CustomBuildSystemConfigWidget::*)(CustomBuildSystemConfigWidget * const, const QString &)) 0x7fffb3006d78 <CustomBuildSystemConfigWidget::renameCurrentConfig(QString const&)>, o=0x2aa8790, arg=0x7fffffff9d40) at /usr/include/qt/QtCore/qobjectdefs_impl.h:143
#12 0x00007fffb3009b93 in QtPrivate::FunctionPointer<void (CustomBuildSystemConfigWidget::*)(QString const&)>::call<QtPrivate::List<QString const&>, void>(void (CustomBuildSystemConfigWidget::*)(QString const&), CustomBuildSystemConfigWidget*, void**) (f=
    (void (CustomBuildSystemConfigWidget::*)(CustomBuildSystemConfigWidget * const, const QString &)) 0x7fffb3006d78 <CustomBuildSystemConfigWidget::renameCurrentConfig(QString const&)>, o=0x2aa8790, arg=0x7fffffff9d40) at /usr/include/qt/QtCore/qobjectdefs_impl.h:162
#13 0x00007fffb30098e9 in QtPrivate::QSlotObject<void (CustomBuildSystemConfigWidget::*)(QString const&), QtPrivate::List<QString const&>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0x2b5c310, r=0x2aa8790, a=0x7fffffff9d40, ret=0x0) at /usr/include/qt/QtCore/qobject_impl.h:120
#14 0x00007ffff119b0be in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#15 0x00007ffff1f4f352 in QComboBox::editTextChanged(QString const&) () at /usr/lib/libQt5Widgets.so.5
#16 0x00007ffff1f59101 in  () at /usr/lib/libQt5Widgets.so.5
#17 0x00007ffff119ad49 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#18 0x00007ffff1f8ecb2 in QLineEdit::textChanged(QString const&) () at /usr/lib/libQt5Widgets.so.5
#19 0x00007ffff1f95289 in  () at /usr/lib/libQt5Widgets.so.5
#20 0x00007ffff119ad49 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#21 0x00007ffff201e535 in QWidgetLineControl::textChanged(QString const&) () at /usr/lib/libQt5Widgets.so.5
#22 0x00007ffff2021a7e in QWidgetLineControl::finishChange(int, bool, bool) () at /usr/lib/libQt5Widgets.so.5
#23 0x00007ffff2021d57 in QWidgetLineControl::internalSetText(QString const&, int, bool) () at /usr/lib/libQt5Widgets.so.5
#24 0x00007ffff1f90982 in QLineEdit::setText(QString const&) () at /usr/lib/libQt5Widgets.so.5
#25 0x00007ffff1f5403f in  () at /usr/lib/libQt5Widgets.so.5
#26 0x00007ffff1f542bf in QComboBox::setCurrentIndex(int) () at /usr/lib/libQt5Widgets.so.5
#27 0x00007fffb30063d9 in CustomBuildSystemConfigWidget::loadFrom(KConfig*) (this=0x2aa8790, cfg=0x24f75d0)
    at /home/flh/projects/kdevelop/projectmanagers/custom-buildsystem/custombuildsystemconfigwidget.cpp:110
#28 0x00007fffb300a081 in CustomBuildSystemKCModule::reset() (this=0x271e180) at /home/flh/projects/kdevelop/projectmanagers/custom-buildsystem/kcm_custombuildsystem.cpp:47
#29 0x00007ffff7ae398f in KDevelop::ConfigDialog::checkForUnsavedChanges(KPageWidgetItem*, KPageWidgetItem*) (this=0x2fdf980, current=0x2ffbbe0, before=0x298b220)
    at /home/flh/projects/kdevplatform/shell/configdialog.cpp:101
#30 0x00007ffff7ae5bd1 in QtPrivate::FunctorCall<QtPrivate::IndexesList<0, 1>, QtPrivate::List<KPageWidgetItem*, KPageWidgetItem*>, void, int (KDevelop::ConfigDialog::*)(KPageWidgetItem*, KPageWidgetItem*)>::call(int (KDevelop::ConfigDialog::*)(KPageWidgetItem*, KPageWidgetItem*), KDevelop::ConfigDialog*, void**) (f=
    (int (KDevelop::ConfigDialog::*)(KDevelop::ConfigDialog * const, KPageWidgetItem *, KPageWidgetItem *)) 0x7ffff7ae37de <KDevelop::ConfigDialog::checkForUnsavedChanges(KPageWidgetItem*, KPageWidgetItem*)>, o=0x2fdf980, arg=0x7fffffffa700) at /usr/include/qt/QtCore/qobjectdefs_impl.h:143
#31 0x00007ffff7ae5974 in QtPrivate::FunctionPointer<int (KDevelop::ConfigDialog::*)(KPageWidgetItem*, KPageWidgetItem*)>::call<QtPrivate::List<KPageWidgetItem*, KPageWidgetItem*>, void>(int (KDevelop::ConfigDialog::*)(KPageWidgetItem*, KPageWidgetItem*), KDevelop::ConfigDialog*, void**) (f=
    (int (KDevelop::ConfigDialog::*)(KDevelop::ConfigDialog * const, KPageWidgetItem *, KPageWidgetItem *)) 0x7ffff7ae37de <KDevelop::ConfigDialog::checkForUnsavedChanges(KPageWidgetItem*, KPageWidgetItem*)>, o=0x2fdf980, arg=0x7fffffffa700) at /usr/include/qt/QtCore/qobjectdefs_impl.h:162
#32 0x00007ffff7ae5567 in QtPrivate::QSlotObject<int (KDevelop::ConfigDialog::*)(KPageWidgetItem*, KPageWidgetItem*), QtPrivate::List<KPageWidgetItem*, KPageWidgetItem*>, void>::impl(int, QtPrivate::QSlotObjectBase*, QObject*, void**, bool*) (which=1, this_=0xaf92e0, r=0x2fdf980, a=0x7fffffffa700, ret=0x0) at /usr/include/qt/QtCore/qobject_impl.h:120
#33 0x00007ffff119b0be in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
---Type <return> to continue, or q <return> to quit---
#34 0x00007ffff3a94ba8 in KPageDialog::currentPageChanged(KPageWidgetItem*, KPageWidgetItem*) () at /usr/lib/libKF5WidgetsAddons.so.5
#35 0x00007ffff3a95bcb in  () at /usr/lib/libKF5WidgetsAddons.so.5
#36 0x00007ffff119ad49 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#37 0x00007ffff3a826c8 in KPageWidget::currentPageChanged(KPageWidgetItem*, KPageWidgetItem*) () at /usr/lib/libKF5WidgetsAddons.so.5
#38 0x00007ffff3a82861 in  () at /usr/lib/libKF5WidgetsAddons.so.5
#39 0x00007ffff119ad49 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#40 0x00007ffff3a7bd67 in KPageView::currentPageChanged(QModelIndex const&, QModelIndex const&) () at /usr/lib/libKF5WidgetsAddons.so.5
#41 0x00007ffff3a7cb54 in  () at /usr/lib/libKF5WidgetsAddons.so.5
#42 0x00007ffff3a7d871 in  () at /usr/lib/libKF5WidgetsAddons.so.5
#43 0x00007ffff119ad49 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/libQt5Core.so.5
#44 0x00007ffff111e4f7 in QItemSelectionModel::selectionChanged(QItemSelection const&, QItemSelection const&) () at /usr/lib/libQt5Core.so.5
#45 0x00007ffff1122dcc in QItemSelectionModel::emitSelectionChanged(QItemSelection const&, QItemSelection const&) () at /usr/lib/libQt5Core.so.5
#46 0x00007ffff1126922 in QItemSelectionModel::select(QItemSelection const&, QFlags<QItemSelectionModel::SelectionFlag>) () at /usr/lib/libQt5Core.so.5
#47 0x00007ffff20c0435 in QListView::setSelection(QRect const&, QFlags<QItemSelectionModel::SelectionFlag>) () at /usr/lib/libQt5Widgets.so.5
#48 0x00007ffff20a18bd in QAbstractItemView::mousePressEvent(QMouseEvent*) () at /usr/lib/libQt5Widgets.so.5
#49 0x00007ffff1e9964f in QWidget::event(QEvent*) () at /usr/lib/libQt5Widgets.so.5
#50 0x00007ffff1f80ece in QFrame::event(QEvent*) () at /usr/lib/libQt5Widgets.so.5
#51 0x00007ffff20a7ed3 in QAbstractItemView::viewportEvent(QEvent*) () at /usr/lib/libQt5Widgets.so.5
#52 0x00007ffff116f1a1 in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5
#53 0x00007ffff1e51325 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#54 0x00007ffff1e598c5 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#55 0x00007ffff116f440 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5
#56 0x00007ffff1e580cd in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () at /usr/lib/libQt5Widgets.so.5
#57 0x00007ffff1eb33e6 in  () at /usr/lib/libQt5Widgets.so.5
#58 0x00007ffff1eb5e03 in  () at /usr/lib/libQt5Widgets.so.5
#59 0x00007ffff1e5134c in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#60 0x00007ffff1e58b61 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/libQt5Widgets.so.5
#61 0x00007ffff116f440 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/libQt5Core.so.5
#62 0x00007ffff16bcd53 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /usr/lib/libQt5Gui.so.5
#63 0x00007ffff16be8c5 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /usr/lib/libQt5Gui.so.5
#64 0x00007ffff169a44b in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Gui.so.5
#65 0x00007fffd7d319e0 in  () at /usr/lib/libQt5XcbQpa.so.5
#66 0x00007fffe4b60587 in g_main_context_dispatch () at /usr/lib/libglib-2.0.so.0
#67 0x00007fffe4b607f0 in  () at /usr/lib/libglib-2.0.so.0
#68 0x00007fffe4b6089c in g_main_context_iteration () at /usr/lib/libglib-2.0.so.0
#69 0x00007ffff11c404f in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#70 0x00007ffff116d89a in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/libQt5Core.so.5
#71 0x00007ffff1175de4 in QCoreApplication::exec() () at /usr/lib/libQt5Core.so.5
#72 0x000000000040f341 in main(int, char**) (argc=3, argv=0x7fffffffe148) at /home/flh/projects/kdevelop/app/main.cpp:763
Comment 1 Francis Herne 2017-03-10 23:31:58 UTC
Git commit e88622395a875b305796d573b44edc8d62f7f79a by Francis Herne.
Committed on 10/03/2017 at 23:25.
Pushed by flherne into branch '5.1'.

CustomBuildSystemConfigWidget: clear configs before reloading.

`loadFrom()` is called on an already-loaded widget when resetting,
 for example after choosing "Discard" when changing to another
 config page.
The existing configs must be cleared before loading new ones.

In debug mode, this caused a crash due to a later assertion failure:

Otherwise, duplicate configs seem likely to cause some glitches.

M  +1    -0    projectmanagers/custom-buildsystem/custombuildsystemconfigwidget.cpp

https://commits.kde.org/kdevelop/e88622395a875b305796d573b44edc8d62f7f79a