From e138a01aef6d6c7cda53975c7f2970523ee45a6e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A5rten=20Nordheim?= Date: Thu, 17 Oct 2024 13:56:36 +0200 Subject: [PATCH] QHash: don't detach from null when calling begin() We allocate space just to traverse over an empty list, then the iterator is turned into a sentinel that matches end(). Change-Id: I45a452cd6421646876245ba3b4f957f1a3bb7f37 Reviewed-by: Thiago Macieira --- src/corelib/tools/qhash.h | 4 ++-- tests/auto/corelib/tools/qhash/tst_qhash.cpp | 8 ++++---- tests/auto/corelib/tools/qset/tst_qset.cpp | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/corelib/tools/qhash.h b/src/corelib/tools/qhash.h index 3d21e027a26..8e87fabfb01 100644 --- a/src/corelib/tools/qhash.h +++ b/src/corelib/tools/qhash.h @@ -1234,7 +1234,7 @@ public: typedef QKeyValueIterator key_value_iterator; // STL style - inline iterator begin() { detach(); return iterator(d->begin()); } + inline iterator begin() { if (!d) return iterator(); detach(); return iterator(d->begin()); } inline const_iterator begin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } inline const_iterator cbegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } inline const_iterator constBegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } @@ -1982,7 +1982,7 @@ public: typedef QKeyValueIterator key_value_iterator; // STL style - inline iterator begin() { detach(); return iterator(d->begin()); } + inline iterator begin() { if (!d) return iterator(); detach(); return iterator(d->begin()); } inline const_iterator begin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } inline const_iterator cbegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } inline const_iterator constBegin() const noexcept { return d ? const_iterator(d->begin()): const_iterator(); } diff --git a/tests/auto/corelib/tools/qhash/tst_qhash.cpp b/tests/auto/corelib/tools/qhash/tst_qhash.cpp index aa8ed99a3c3..59e8ed6b586 100644 --- a/tests/auto/corelib/tools/qhash/tst_qhash.cpp +++ b/tests/auto/corelib/tools/qhash/tst_qhash.cpp @@ -1675,9 +1675,9 @@ void iteratorsInEmptyHashTestMethod() QVERIFY(it7 == Iter()); QVERIFY(!hash3.isDetached()); - Iter it8 = hash3.begin(); // calls detach() + Iter it8 = hash3.begin(); QVERIFY(it8 == Iter()); - QVERIFY(hash3.isDetached()); + QVERIFY(!hash3.isDetached()); // No detach from empty hash just for iteration! } void tst_QHash::iteratorsInEmptyHash() @@ -1887,9 +1887,9 @@ void keyValueIteratorInEmptyHashTestMethod() QVERIFY(it5 == KeyValueIter()); QVERIFY(!hash3.isDetached()); - KeyValueIter it6 = hash3.keyValueBegin(); // calls detach() + KeyValueIter it6 = hash3.keyValueBegin(); QVERIFY(it6 == KeyValueIter()); - QVERIFY(hash3.isDetached()); + QVERIFY(!hash3.isDetached()); // No detach in empty hash just for iteration } void tst_QHash::keyValueIteratorInEmptyHash() diff --git a/tests/auto/corelib/tools/qset/tst_qset.cpp b/tests/auto/corelib/tools/qset/tst_qset.cpp index 07d182b9b3f..3ef061659dc 100644 --- a/tests/auto/corelib/tools/qset/tst_qset.cpp +++ b/tests/auto/corelib/tools/qset/tst_qset.cpp @@ -507,7 +507,7 @@ void tst_QSet::begin() QVERIFY(i == j); QVERIFY(k == j); QVERIFY(!set3.isDetached()); - QVERIFY(set4.isDetached()); + QVERIFY(!set4.isDetached()); // d-ptr is null } set4.insert(1);