-
Bug
-
Resolution: Done
-
P1: Critical
-
6.0.0 Beta2
-
None
-
83e95956ed58e88b11e2cc3cb61c5beacb7985db (qt/qtbase/6.0.0) 2f747bb57cd958f9fc65f406474c429ca00941ac (qt/qtbase/6.0) 6012285e7dedb4364e2db087b7d5cbfc2973320a (qt/qtbase/dev)
Add below test to tst_qtreeview.cpp:
static void populateModel(QStandardItemModel *model)
{
const int depth = 10;
for (int i1 = 0; i1 < depth; ++i1) {
QStandardItem *s1 = new QStandardItem;
s1->setText(QString::number(i1));
model->appendRow(s1);
for (int i2 = 0; i2 < depth; ++i2) {
QStandardItem *s2 = new QStandardItem;
s2->setText(QStringLiteral("%1 - %2").arg(i1).arg(i2));
s1->appendRow(s2);
for (int i3 = 0; i3 < depth; ++i3) {
QStandardItem *s3 = new QStandardItem;
s3->setText(QStringLiteral("%1 - %2 - %3").arg(i1).arg(i2).arg(i3));
s2->appendRow(s3);
}
}
}
}
void tst_QTreeView::expandAfterTake()
{
QStandardItemModel model;
populateModel(&model);
QTreeView view;
view.setUniformRowHeights(true);
view.setModel(&model);
view.show();
QVERIFY(QTest::qWaitForWindowExposed(&view));
view.expandAll();
while (model.takeItem(0))
; // mimic clear, but this leaves QTreeViewPrivate::expandedIndexes dirty with corrupted items
populateModel(&model); // populate model again, having corrupted items inside QTreeViewPrivate::expandedIndexes
view.expandAll(); // adding new items to QTreeViewPrivate::expandedIndexes with corrupted persistent indices, causing crash sometimes
}
Sometimes it happens, that this test passes, however, in more than 50% cases it crashes with assert:
QFATAL : tst_QTreeView::expandAfterTake() ASSERT: "it.isUnused()" in file ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h, line 519 FAIL! : tst_QTreeView::expandAfterTake() Received a fatal error. Loc: [Unknown file(0)] Totals: 96 passed, 1 failed, 0 skipped, 0 blacklisted, 7099ms
Call stack:
#0 0x00007ffff580e9d5 in raise () from /lib64/libc.so.6
#1 0x00007ffff57f78a4 in abort () from /lib64/libc.so.6
#2 0x00007ffff5e98f99 in qt_message_fatal (context=..., message=...)
at /home/jarek/dev/qt-dev/qtbase/src/corelib/global/qlogging.cpp:1893
#3 0x00007ffff5e9524e in QMessageLogger::fatal (this=0x7fffffffbf50, msg=0x7ffff631bea8 "ASSERT: \"%s\" in file %s, line %d")
at /home/jarek/dev/qt-dev/qtbase/src/corelib/global/qlogging.cpp:889
#4 0x00007ffff5e87864 in qt_assert (assertion=0x7ffff7d2c00a "it.isUnused()",
file=0x7ffff7d2bb38 "../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h", line=519)
at /home/jarek/dev/qt-dev/qtbase/src/corelib/global/qglobal.cpp:3108
#5 0x00007ffff7ac5137 in QHashPrivate::Data<QHashPrivate::Node<QPersistentModelIndex, QHashDummyValue> >::rehash (this=0x659290,
sizeHint=2049) at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h:519
#6 0x00007ffff7ac38e2 in QHashPrivate::Data<QHashPrivate::Node<QPersistentModelIndex, QHashDummyValue> >::findOrInsert (
this=0x659290, key=...) at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h:589
#7 0x00007ffff7ac1f83 in QHash<QPersistentModelIndex, QHashDummyValue>::emplace<QHashDummyValue const&> (this=0x9119d0, key=...)
at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h:1121
#8 0x00007ffff7ac01a0 in QHash<QPersistentModelIndex, QHashDummyValue>::emplace<QHashDummyValue const&> (this=0x9119d0, key=...)
at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h:1113
#9 0x00007ffff7abe3b7 in QHash<QPersistentModelIndex, QHashDummyValue>::insert (this=0x9119d0, key=..., value=...)
at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qhash.h:1091
#10 0x00007ffff7abc9c8 in QSet<QPersistentModelIndex>::insert (this=0x9119d0, value=...)
at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/tools/qset.h:181
#11 0x00007ffff7b1e5b9 in QTreeViewPrivate::storeExpanded (this=0x9114d0, idx=...)
at ../../include/QtWidgets/6.0.0/QtWidgets/private/../../../../../../../qt-dev/qtbase/src/widgets/itemviews/qtreeview_p.h:215
#12 0x00007ffff7b1a5e7 in QTreeViewPrivate::layout (this=0x9114d0, i=1933, recursiveExpanding=true, afterIsUninitialized=true)
at /home/jarek/dev/qt-dev/qtbase/src/widgets/itemviews/qtreeview.cpp:3404
#13 0x00007ffff7b1a663 in QTreeViewPrivate::layout (this=0x9114d0, i=1888, recursiveExpanding=true, afterIsUninitialized=true)
at /home/jarek/dev/qt-dev/qtbase/src/widgets/itemviews/qtreeview.cpp:3407
#14 0x00007ffff7b1a663 in QTreeViewPrivate::layout (this=0x9114d0, i=-1, recursiveExpanding=true, afterIsUninitialized=true)
at /home/jarek/dev/qt-dev/qtbase/src/widgets/itemviews/qtreeview.cpp:3407
#15 0x00007ffff7b170cd in QTreeView::expandAll (this=0x7fffffffc5f0)
at /home/jarek/dev/qt-dev/qtbase/src/widgets/itemviews/qtreeview.cpp:2699
#16 0x0000000000435dd3 in tst_QTreeView::expandAfterTake (this=0x7fffffffd620)
at /home/jarek/dev/qt-dev/qtbase/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp:1829
#17 0x0000000000465ae3 in tst_QTreeView::qt_static_metacall (_o=0x7fffffffd620, _c=QMetaObject::InvokeMetaMethod, _id=38,
_a=0x7fffffffc710) at .moc/tst_qtreeview.moc:640
#18 0x00007ffff61efd48 in QMetaMethod::invoke (this=0x5ddd50, object=0x7fffffffd620, connectionType=Qt::DirectConnection,
returnValue=..., val0=..., val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...)
at /home/jarek/dev/qt-dev/qtbase/src/corelib/kernel/qmetaobject.cpp:2322
#19 0x00007ffff663f588 in QMetaMethod::invoke (this=0x5ddd50, object=0x7fffffffd620, connectionType=Qt::DirectConnection, val0=...,
val1=..., val2=..., val3=..., val4=..., val5=..., val6=..., val7=..., val8=..., val9=...)
at ../../include/QtCore/../../../../qt-dev/qtbase/src/corelib/kernel/qmetaobject.h:125
#20 0x00007ffff66373d7 in QTest::TestMethods::invokeTestOnData (this=0x7fffffffd420, index=31)
at /home/jarek/dev/qt-dev/qtbase/src/testlib/qtestcase.cpp:934
#21 0x00007ffff6637f1b in QTest::TestMethods::invokeTest (this=0x7fffffffd420, index=31, data=0x0, watchDog=0x0)
at /home/jarek/dev/qt-dev/qtbase/src/testlib/qtestcase.cpp:1163
--Type <RET> for more, q to quit, c to continue without paging--
#22 0x00007ffff663928f in QTest::TestMethods::invokeTests (this=0x7fffffffd420, testObject=0x7fffffffd620)
at /home/jarek/dev/qt-dev/qtbase/src/testlib/qtestcase.cpp:1506
#23 0x00007ffff6639aa3 in QTest::qRun () at /home/jarek/dev/qt-dev/qtbase/src/testlib/qtestcase.cpp:1933
#24 0x00007ffff6639581 in QTest::qExec (testObject=0x7fffffffd620, argc=1, argv=0x7fffffffd748)
at /home/jarek/dev/qt-dev/qtbase/src/testlib/qtestcase.cpp:1841
#25 0x000000000046563e in main (argc=1, argv=0x7fffffffd748)
at /home/jarek/dev/qt-dev/qtbase/tests/auto/widgets/itemviews/qtreeview/tst_qtreeview.cpp:5261
For Qt 5.15 I cannot crash on the above test.
Please see https://codereview.qt-project.org/c/qt/qtbase/+/324206
This issue is a result of investigation on: QTCREATORBUG-24981
- relates to
-
QTBUG-89146 QTreeView crashes because it stores QModelIndexes
-
- Open
-
- resulted from
-
QTCREATORBUG-24981 Crash when switching sessions (built with Qt6)
-
- Closed
-