diff options
author | Marc Mutz <marc.mutz@kdab.com> | 2014-09-03 14:17:07 +0200 |
---|---|---|
committer | Marc Mutz <marc.mutz@kdab.com> | 2014-09-23 20:42:01 +0200 |
commit | 1ce6e432b63d1706eda318170ea0d6ea094c2d6c (patch) | |
tree | e21c2e5c2bc76334a79455b884a1966ca1d21102 /tests/auto/corelib/tools | |
parent | 42d4e054a6cebd83d7b086330d64d108916de3e3 (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/auto/corelib/tools')
-rw-r--r-- | tests/auto/corelib/tools/qversionnumber/tst_qversionnumber.cpp | 17 |
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() |