From fe9e6b2ceb77befb77e664cda9842ff95ddf08a3 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Sun, 26 Jul 2020 08:31:46 -0700 Subject: QString::vasprintf: fix 't' modifier for integers on 64-bit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ‘t’ Specifies that the argument is a ‘ptrdiff_t’. This modifier was introduced in ISO C99. We use qsizetype, which is the same width as ptrdiff_t, so it makes no difference in va_arg(). Change-Id: Iea47e0f8fc8b40378df7fffd16255730109413a5 Reviewed-by: Tor Arne Vestbø Reviewed-by: Lars Knoll --- tests/auto/corelib/text/qstring/tst_qstring.cpp | 60 ++++++++++++++----------- 1 file changed, 35 insertions(+), 25 deletions(-) (limited to 'tests/auto/corelib/text/qstring/tst_qstring.cpp') diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index e0d5180b78..700284f043 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -580,7 +580,6 @@ private slots: void truncateWithNegative() const; void QCharRefMutableUnicode() const; void QCharRefDetaching() const; - void sprintfZU() const; void repeatedSignature() const; void repeated() const; void repeated_data() const; @@ -1257,6 +1256,33 @@ void tst_QString::asprintf() QCOMPARE(QString::asprintf("%lf", 1.23456789), QLatin1String("1.234568")); QCOMPARE(QString::asprintf("%p", ptrValue(0xbfffd350)), QLatin1String("0xbfffd350")); QCOMPARE(QString::asprintf("%p", ptrValue(0)), QLatin1String("0x0")); + QCOMPARE(QString::asprintf("%td", ptrdiff_t(6)), QString::fromLatin1("6")); + QCOMPARE(QString::asprintf("%td", ptrdiff_t(-6)), QString::fromLatin1("-6")); + QCOMPARE(QString::asprintf("%zu", size_t(6)), QString::fromLatin1("6")); + QCOMPARE(QString::asprintf("%zu", size_t(1) << 31), QString::fromLatin1("2147483648")); + + // cross z and t + using ssize_t = std::make_signed::type; // should be ptrdiff_t + using uptrdiff_t = std::make_unsigned::type; // should be size_t + QCOMPARE(QString::asprintf("%tu", uptrdiff_t(6)), QString::fromLatin1("6")); + QCOMPARE(QString::asprintf("%tu", uptrdiff_t(1) << 31), QString::fromLatin1("2147483648")); + QCOMPARE(QString::asprintf("%zd", ssize_t(-6)), QString::fromLatin1("-6")); + + if (sizeof(qsizetype) > sizeof(int)) { + // 64-bit test + QCOMPARE(QString::asprintf("%zu", SIZE_MAX), QString::fromLatin1("18446744073709551615")); + QCOMPARE(QString::asprintf("%td", PTRDIFF_MAX), QString::fromLatin1("9223372036854775807")); + QCOMPARE(QString::asprintf("%td", PTRDIFF_MIN), QString::fromLatin1("-9223372036854775808")); + + // sign extension is easy, make sure we can get something middle-ground + // (24 + 8 = 32; addition used to avoid warning about shifting more + // than size type on 32-bit systems) + size_t ubig = size_t(1) << (24 + sizeof(size_t)); + ptrdiff_t sbig = ptrdiff_t(1) << (24 + sizeof(ptrdiff_t)); + QCOMPARE(QString::asprintf("%zu", ubig), QString::fromLatin1("4294967296")); + QCOMPARE(QString::asprintf("%td", sbig), QString::fromLatin1("4294967296")); + QCOMPARE(QString::asprintf("%td", -sbig), QString::fromLatin1("-4294967296")); + } int i = 6; long l = -2; @@ -1265,6 +1291,14 @@ void tst_QString::asprintf() double d = -514.25683; QCOMPARE(QString::asprintf("%f", d), QLatin1String("-514.256830")); + + { + /* This code crashed. I don't know how to reduce it further. In other words, + * both %zu and %s needs to be present. */ + size_t s = 6; + QCOMPARE(QString::asprintf("%zu%s", s, "foo"), QString::fromLatin1("6foo")); + QCOMPARE(QString::asprintf("%zu %s\n", s, "foo"), QString::fromLatin1("6 foo\n")); + } } void tst_QString::asprintfS() @@ -6368,30 +6402,6 @@ void tst_QString::QCharRefDetaching() const } } -void tst_QString::sprintfZU() const -{ - { - size_t s = 6; - QCOMPARE(QString::asprintf("%zu", s), QString::fromLatin1("6")); - } - - { - QCOMPARE(QString::asprintf("%s\n", "foo"), QString::fromLatin1("foo\n")); - } - - { - /* This code crashed. I don't know how to reduce it further. In other words, - * both %zu and %s needs to be present. */ - size_t s = 6; - QCOMPARE(QString::asprintf("%zu%s", s, "foo"), QString::fromLatin1("6foo")); - } - - { - size_t s = 6; - QCOMPARE(QString::asprintf("%zu %s\n", s, "foo"), QString::fromLatin1("6 foo\n")); - } -} - void tst_QString::repeatedSignature() const { /* repated() should be a const member. */ -- cgit v1.2.3