QTest: fix bug dereferencing nullptr in toString<std::nullptr_t>()
Amends commitbb100756cc1eae. The generic instantiation of this function had a std::nullptr_t * parameter, but callers had special code to pass a nullptr there because we never needed a value of a nullptr (it's always a null pointer). For example, in compare_ptr_helper(): auto lhsFormatter = Internal::pointerToString<QObject>; auto rhsFormatter = Internal::genericToString<std::nullptr_t>; return compare_helper(t1 == nullptr, "Compared QObject pointers are not the same", const_cast<const QObject *>(t1), nullptr, lhsFormatter, rhsFormatter, actual, expected, file, line); But in debug mode, some compilers did emit a load from this memory location, causing a crash. So we just specialize this function to avoid such. We had a test for this... except it was never reached because the earlier QCOMPARE() had already failed. For the test, this amends commitae02188233. Conflict resolution for 6.8: regenerated the expected output for tst_selftest. Fixes: QTBUG-133330 Change-Id: I2cd3bb475788431c6a0dfffd28e730e8b613e033 Reviewed-by: Christian Ehrlicher <ch.ehrlicher@gmx.de> Reviewed-by: Ivan Solovev <ivan.solovev@qt.io> (cherry picked from commit e19b633c468123526660b40ae110f46090682c76) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 042e713cb7800f97c10d2d75a717ceb3e41ab29a) Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
parent
5762b152f9
commit
167af1611f
|
|
@ -367,6 +367,11 @@ namespace QTest
|
|||
return toString(static_cast<const char *>(arg));
|
||||
}
|
||||
|
||||
template <> inline const char *genericToString<std::nullptr_t>(const void *)
|
||||
{
|
||||
return QTest::toString(nullptr);
|
||||
}
|
||||
|
||||
template <typename T> const char *pointerToString(const void *arg)
|
||||
{
|
||||
using QTest::toString;
|
||||
|
|
|
|||
|
|
@ -281,10 +281,10 @@ void tst_Cmptest::compareQObjects()
|
|||
object1.setObjectName(QStringLiteral("object1"));
|
||||
QObject object2;
|
||||
object2.setObjectName(QStringLiteral("object2"));
|
||||
QCOMPARE(&object1, &object1);
|
||||
QCOMPARE(&object1, &object2);
|
||||
QCOMPARE(&object1, nullptr);
|
||||
QCOMPARE(nullptr, &object2);
|
||||
[&] { QCOMPARE(&object1, &object1); }();
|
||||
[&] { QCOMPARE(&object1, &object2); }();
|
||||
[&] { QCOMPARE(&object1, nullptr); }();
|
||||
[&] { QCOMPARE(nullptr, &object2); }();
|
||||
}
|
||||
|
||||
struct PhonyClass
|
||||
|
|
|
|||
|
|
@ -129,6 +129,16 @@
|
|||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (&object1): QObject/"object1"
|
||||
Expected (&object2): QObject/"object2"]]></Description>
|
||||
</Incident>
|
||||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (&object1): QObject/"object1"
|
||||
Expected (nullptr) : "nullptr"]]></Description>
|
||||
</Incident>
|
||||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (nullptr) : "nullptr"
|
||||
Expected (&object2): QObject/"object2"]]></Description>
|
||||
</Incident>
|
||||
<Duration msecs="0"/>
|
||||
|
|
|
|||
|
|
@ -172,6 +172,30 @@ not ok 21 - compareQObjects()
|
|||
file: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
|
||||
line: 0
|
||||
...
|
||||
not ok 21 - compareQObjects()
|
||||
---
|
||||
type: QCOMPARE
|
||||
message: Compared QObject pointers are not the same
|
||||
wanted: "nullptr" (nullptr)
|
||||
found: QObject/"object1" (&object1)
|
||||
expected: "nullptr" (nullptr)
|
||||
actual: QObject/"object1" (&object1)
|
||||
at: tst_Cmptest::compareQObjects() (qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp:0)
|
||||
file: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
|
||||
line: 0
|
||||
...
|
||||
not ok 21 - compareQObjects()
|
||||
---
|
||||
type: QCOMPARE
|
||||
message: Compared QObject pointers are not the same
|
||||
wanted: QObject/"object2" (&object2)
|
||||
found: "nullptr" (nullptr)
|
||||
expected: QObject/"object2" (&object2)
|
||||
actual: "nullptr" (nullptr)
|
||||
at: tst_Cmptest::compareQObjects() (qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp:0)
|
||||
file: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp
|
||||
line: 0
|
||||
...
|
||||
ok 22 - compareQStringLists(empty lists)
|
||||
ok 23 - compareQStringLists(equal lists)
|
||||
not ok 24 - compareQStringLists(last item different)
|
||||
|
|
|
|||
|
|
@ -55,6 +55,10 @@
|
|||
##teamcity[testStarted name='compareQObjects()' flowId='tst_Cmptest']
|
||||
##teamcity[testFailed name='compareQObjects()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)|]' details='Compared QObject pointers are not the same|n Actual (&object1): QObject/"object1"|n Expected (&object2): QObject/"object2"' flowId='tst_Cmptest']
|
||||
##teamcity[testFinished name='compareQObjects()' flowId='tst_Cmptest']
|
||||
##teamcity[testFailed name='compareQObjects()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)|]' details='Compared QObject pointers are not the same|n Actual (&object1): QObject/"object1"|n Expected (nullptr) : "nullptr"' flowId='tst_Cmptest']
|
||||
##teamcity[testFinished name='compareQObjects()' flowId='tst_Cmptest']
|
||||
##teamcity[testFailed name='compareQObjects()' message='Failure! |[Loc: qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)|]' details='Compared QObject pointers are not the same|n Actual (nullptr) : "nullptr"|n Expected (&object2): QObject/"object2"' flowId='tst_Cmptest']
|
||||
##teamcity[testFinished name='compareQObjects()' flowId='tst_Cmptest']
|
||||
##teamcity[testStarted name='compareQStringLists(empty lists)' flowId='tst_Cmptest']
|
||||
##teamcity[testFinished name='compareQStringLists(empty lists)' flowId='tst_Cmptest']
|
||||
##teamcity[testStarted name='compareQStringLists(equal lists)' flowId='tst_Cmptest']
|
||||
|
|
|
|||
|
|
@ -63,6 +63,14 @@ FAIL! : tst_Cmptest::compareQObjects() Compared QObject pointers are not the sa
|
|||
Actual (&object1): QObject/"object1"
|
||||
Expected (&object2): QObject/"object2"
|
||||
Loc: [qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)]
|
||||
FAIL! : tst_Cmptest::compareQObjects() Compared QObject pointers are not the same
|
||||
Actual (&object1): QObject/"object1"
|
||||
Expected (nullptr) : "nullptr"
|
||||
Loc: [qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)]
|
||||
FAIL! : tst_Cmptest::compareQObjects() Compared QObject pointers are not the same
|
||||
Actual (nullptr) : "nullptr"
|
||||
Expected (&object2): QObject/"object2"
|
||||
Loc: [qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp(0)]
|
||||
PASS : tst_Cmptest::compareQStringLists(empty lists)
|
||||
PASS : tst_Cmptest::compareQStringLists(equal lists)
|
||||
FAIL! : tst_Cmptest::compareQStringLists(last item different) Compared lists differ at index 2.
|
||||
|
|
|
|||
|
|
@ -131,6 +131,16 @@
|
|||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (&object1): QObject/"object1"
|
||||
Expected (&object2): QObject/"object2"]]></Description>
|
||||
</Incident>
|
||||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (&object1): QObject/"object1"
|
||||
Expected (nullptr) : "nullptr"]]></Description>
|
||||
</Incident>
|
||||
<Incident type="fail" file="qtbase/tests/auto/testlib/selftests/cmptest/tst_cmptest.cpp" line="0">
|
||||
<Description><![CDATA[Compared QObject pointers are not the same
|
||||
Actual (nullptr) : "nullptr"
|
||||
Expected (&object2): QObject/"object2"]]></Description>
|
||||
</Incident>
|
||||
<Duration msecs="0"/>
|
||||
|
|
|
|||
Loading…
Reference in New Issue