From 76004502baa118016c8e0f32895af7a822f1ba37 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Sat, 16 Nov 2019 23:25:26 +0100 Subject: Get rid of shared null for QByteArray, QString and QVector As a side effect, data() can now return a nullptr. This has the potential to cause crashes in existig code. To work around this, return an empty string from QString::data() and QByteArray::data() for now. For Qt 6 (and once all our internal issues are fixed), data() will by default return a nullptr for a null QString, but we'll offer a #define to enable backwards compatible behavior. Change-Id: I4f66d97ff1dce3eb99a239f1eab9106fa9b1741a Reviewed-by: Thiago Macieira --- .../corelib/tools/qarraydata/tst_qarraydata.cpp | 46 ++++++++-------------- 1 file changed, 17 insertions(+), 29 deletions(-) (limited to 'tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp') diff --git a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp index 7b42b27f6e..128bc51553 100644 --- a/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp +++ b/tests/auto/corelib/tools/qarraydata/tst_qarraydata.cpp @@ -156,20 +156,15 @@ void tst_QArrayData::sharedNullEmpty() void tst_QArrayData::simpleVector() { - QArrayData data0 = { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }; - QStaticArrayData data1 = { - { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, - { 0, 1, 2, 3, 4, 5, 6 } - }; - + int data[] = { 0, 1, 2, 3, 4, 5, 6 }; int array[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; SimpleVector v1; SimpleVector v2(v1); - SimpleVector v3(static_cast *>(&data0), 0, 0); - SimpleVector v4(data1); - SimpleVector v5(static_cast *>(&data0), 0, 0); - SimpleVector v6(data1); + SimpleVector v3(nullptr, nullptr, 0); + SimpleVector v4(nullptr, data, 0); + SimpleVector v5(nullptr, data, 1); + SimpleVector v6(nullptr, data, 7); SimpleVector v7(10, 5); SimpleVector v8(array, array + sizeof(array)/sizeof(*array)); @@ -190,7 +185,7 @@ void tst_QArrayData::simpleVector() QVERIFY(v2.isEmpty()); QVERIFY(v3.isEmpty()); QVERIFY(v4.isEmpty()); - QVERIFY(v5.isEmpty()); + QVERIFY(!v5.isEmpty()); QVERIFY(!v6.isEmpty()); QVERIFY(!v7.isEmpty()); QVERIFY(!v8.isEmpty()); @@ -199,7 +194,7 @@ void tst_QArrayData::simpleVector() QCOMPARE(v2.size(), size_t(0)); QCOMPARE(v3.size(), size_t(0)); QCOMPARE(v4.size(), size_t(0)); - QCOMPARE(v5.size(), size_t(0)); + QCOMPARE(v5.size(), size_t(1)); QCOMPARE(v6.size(), size_t(7)); QCOMPARE(v7.size(), size_t(10)); QCOMPARE(v8.size(), size_t(10)); @@ -248,13 +243,13 @@ void tst_QArrayData::simpleVector() QVERIFY(v1 == v2); QVERIFY(v1 == v3); QVERIFY(v1 == v4); - QVERIFY(v1 == v5); + QVERIFY(v1 != v5); QVERIFY(!(v1 == v6)); QVERIFY(v1 != v6); QVERIFY(v4 != v6); QVERIFY(v5 != v6); - QVERIFY(!(v1 != v5)); + QVERIFY(!(v1 == v5)); QVERIFY(v1 < v6); QVERIFY(!(v6 < v1)); @@ -428,17 +423,10 @@ void tst_QArrayData::simpleVectorReserve_data() QTest::newRow("empty") << SimpleVector(0, 42) << size_t(0) << size_t(0); QTest::newRow("non-empty") << SimpleVector(5, 42) << size_t(5) << size_t(5); - static const QStaticArrayData array = { - { Q_BASIC_ATOMIC_INITIALIZER(-1), QArrayData::StaticDataFlags, 0 }, - { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } }; - const QArrayDataPointerRef p = { - static_cast *>( - const_cast(&array.header)), - const_cast(array.data), - sizeof(array.data) / sizeof(array.data[0]) }; - - QTest::newRow("static") << SimpleVector(p) << size_t(0) << size_t(15); - QTest::newRow("raw-data") << SimpleVector::fromRawData(array.data, 15) << size_t(0) << size_t(15); + static const int array[] = + { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 }; + + QTest::newRow("raw-data") << SimpleVector::fromRawData(array, 15) << size_t(0) << size_t(15); } void tst_QArrayData::simpleVectorReserve() @@ -519,7 +507,7 @@ void tst_QArrayData::allocate_data() }; QArrayData *shared_empty; - QArrayData::allocate(&shared_empty, 1, alignof(QArrayData), 0); + (void)QArrayData::allocate(&shared_empty, 1, alignof(QArrayData), 0); QVERIFY(shared_empty); struct { @@ -1180,15 +1168,15 @@ void fromRawData_impl() { // Default: Immutable, sharable SimpleVector raw = SimpleVector::fromRawData(array, - sizeof(array)/sizeof(array[0]), QArrayData::DefaultRawFlags); + sizeof(array)/sizeof(array[0])); QCOMPARE(raw.size(), size_t(11)); QCOMPARE((const T *)raw.constBegin(), array); QCOMPARE((const T *)raw.constEnd(), (const T *)(array + sizeof(array)/sizeof(array[0]))); - QVERIFY(!raw.isShared()); + QVERIFY(raw.isShared()); QVERIFY(SimpleVector(raw).isSharedWith(raw)); - QVERIFY(!raw.isShared()); + QVERIFY(raw.isShared()); // Detach QCOMPARE(raw.back(), T(11)); -- cgit v1.2.3