summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorMarc Mutz <marc.mutz@kdab.com>2014-09-03 14:17:07 +0200
committerMarc Mutz <marc.mutz@kdab.com>2014-09-23 20:42:01 +0200
commit1ce6e432b63d1706eda318170ea0d6ea094c2d6c (patch)
treee21c2e5c2bc76334a79455b884a1966ca1d21102 /tests
parent42d4e054a6cebd83d7b086330d64d108916de3e3 (diff)
QVersionNumber: correctly fail for numerically very large segments
The result of qstrtoull() was unconditionally truncated to an int, resulting in wrong values being appended to the segments vector when the numerical segment value was above INT_MAX. Prevent this by first checking the return value of qstrtoull as a qulonglong for values larger than INT_MAX and stopping processing in that case. That means that segments that numerically overflow an int are now considered part of the suffix. Also added tests for the case where a segment value is larger than ULLONG_MAX. That was already working correctly. Change-Id: Ia4b89021dcfe6bfae27c8d89bb678ec5e0e3b847 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'tests')
-rw-r--r--tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp17
1 files changed, 17 insertions, 0 deletions
diff --git a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
index a43bb3ee68..f2df2271d9 100644
--- a/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
+++ b/tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp
@@ -435,6 +435,23 @@ void tst_QVersionNumber::assignment()
void tst_QVersionNumber::fromString_data()
{
singleInstanceData();
+
+ const quint64 largerThanIntCanHold = quint64(std::numeric_limits<int>::max()) + 1;
+ const QString largerThanIntCanHoldString0 = QString::number(largerThanIntCanHold) + ".0";
+ const QString largerThanIntCanHoldString1 = "0." + QString::number(largerThanIntCanHold);
+
+ QTest::newRow(qPrintable(largerThanIntCanHoldString0))
+ << QVector<int>() << QVersionNumber() << QString() << largerThanIntCanHoldString0 << 0 << true;
+ QTest::newRow(qPrintable(largerThanIntCanHoldString1))
+ << QVector<int>(0) << QVersionNumber(0) << QStringLiteral("0") << largerThanIntCanHoldString1 << 1 << true;
+
+ const QString largerThanULongLongCanHoldString0 = QString::number(std::numeric_limits<qulonglong>::max()) + "0.0"; // 10x ULLONG_MAX
+ const QString largerThanULongLongCanHoldString1 = "0." + QString::number(std::numeric_limits<qulonglong>::max()) + '0'; // 10x ULLONG_MAX
+
+ QTest::newRow(qPrintable(largerThanULongLongCanHoldString0))
+ << QVector<int>() << QVersionNumber() << QString() << largerThanULongLongCanHoldString0 << 0 << true;
+ QTest::newRow(qPrintable(largerThanULongLongCanHoldString1))
+ << QVector<int>(0) << QVersionNumber(0) << QStringLiteral("0") << largerThanULongLongCanHoldString1 << 1 << true;
}
void tst_QVersionNumber::fromString()