QTextStream: fix UB calls to qAbs() with minimal arguments
QTextStream's operator<<(number) uses qAbs to extract the "absolute value" of number, and passes that and the number's sign to an internal formatting function. However qAbs is unsuitable for the task, because it will fail if `number` is minimal, as it returns the same type of its input. Since we can afford to change the type of the result, call the private qUnsignedAbs() function instead. Change-Id: Ib813a199503f2d07c78bb76862ab2e15d68d0ec2 Pick-to: 6.9 6.8 Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
9940f3f280
commit
8f762b546f
@ -2296,7 +2296,7 @@ QTextStream &QTextStream::operator<<(signed short i)
|
||||
{
|
||||
Q_D(QTextStream);
|
||||
CHECK_VALID_STREAM(*this);
|
||||
d->putNumber((qulonglong)qAbs(qlonglong(i)), i < 0);
|
||||
d->putNumber(QtPrivate::qUnsignedAbs(i), i < 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -2322,7 +2322,7 @@ QTextStream &QTextStream::operator<<(signed int i)
|
||||
{
|
||||
Q_D(QTextStream);
|
||||
CHECK_VALID_STREAM(*this);
|
||||
d->putNumber((qulonglong)qAbs(qlonglong(i)), i < 0);
|
||||
d->putNumber(QtPrivate::qUnsignedAbs(i), i < 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -2348,7 +2348,7 @@ QTextStream &QTextStream::operator<<(signed long i)
|
||||
{
|
||||
Q_D(QTextStream);
|
||||
CHECK_VALID_STREAM(*this);
|
||||
d->putNumber((qulonglong)qAbs(qlonglong(i)), i < 0);
|
||||
d->putNumber(QtPrivate::qUnsignedAbs(i), i < 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
@ -2374,7 +2374,7 @@ QTextStream &QTextStream::operator<<(qlonglong i)
|
||||
{
|
||||
Q_D(QTextStream);
|
||||
CHECK_VALID_STREAM(*this);
|
||||
d->putNumber((qulonglong)qAbs(i), i < 0);
|
||||
d->putNumber(QtPrivate::qUnsignedAbs(i), i < 0);
|
||||
return *this;
|
||||
}
|
||||
|
||||
|
@ -2304,6 +2304,7 @@ void tst_QTextStream::signedShort_write_operator_ToDevice_data()
|
||||
QTest::newRow("65535") << Q_UINT64_C(65535) << QByteArray("-1") << QByteArray("-1");
|
||||
QTest::newRow("65536") << Q_UINT64_C(65536) << QByteArray("0") << QByteArray("0");
|
||||
QTest::newRow("65537") << Q_UINT64_C(65537) << QByteArray("1") << QByteArray("1");
|
||||
QTest::newRow("-32768") << quint64(-32768) << QByteArray("-32768") << QByteArray("-32,768");
|
||||
}
|
||||
IMPLEMENT_STREAM_LEFT_INT_OPERATOR_TEST(signedShort, signed short)
|
||||
;
|
||||
@ -2350,6 +2351,7 @@ void tst_QTextStream::signedInt_write_operator_ToDevice_data()
|
||||
QTest::newRow("4294967295") << Q_UINT64_C(4294967295) << QByteArray("-1") << QByteArray("-1");
|
||||
QTest::newRow("4294967296") << Q_UINT64_C(4294967296) << QByteArray("0") << QByteArray("0");
|
||||
QTest::newRow("4294967297") << Q_UINT64_C(4294967297) << QByteArray("1") << QByteArray("1");
|
||||
QTest::newRow("-2147483648") << quint64(-2147483648) << QByteArray("-2147483648") << QByteArray("-2,147,483,648");
|
||||
}
|
||||
IMPLEMENT_STREAM_LEFT_INT_OPERATOR_TEST(signedInt, signed int)
|
||||
;
|
||||
@ -2406,6 +2408,7 @@ void tst_QTextStream::qlonglong_write_operator_ToDevice_data()
|
||||
QTest::newRow("9223372036854775808") << Q_UINT64_C(9223372036854775808) << QByteArray("-9223372036854775808") << QByteArray("-9,223,372,036,854,775,808");
|
||||
QTest::newRow("9223372036854775809") << Q_UINT64_C(9223372036854775809) << QByteArray("-9223372036854775807") << QByteArray("-9,223,372,036,854,775,807");
|
||||
QTest::newRow("18446744073709551615") << Q_UINT64_C(18446744073709551615) << QByteArray("-1") << QByteArray("-1");
|
||||
QTest::newRow("-9223372036854775808") << quint64(Q_INT64_C(-9223372036854775807) - 1) << QByteArray("-9223372036854775808") << QByteArray("-9,223,372,036,854,775,808");
|
||||
}
|
||||
IMPLEMENT_STREAM_LEFT_INT_OPERATOR_TEST(qlonglong, qlonglong)
|
||||
;
|
||||
|
Loading…
x
Reference in New Issue
Block a user