From bdee2c9760109d8e483c3b0e5c99fabc48bf21f5 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Wed, 26 Oct 2022 08:50:37 -0700 Subject: [PATCH] QString::asprintf: fix handling of a present-but-empty precision MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit %.f should be handled like %.0f. You probably don't want it for strings, though. Fixes: QTBUG-107991 Pick-to: 6.2 6.4 Change-Id: I07ec23f3cb174fb197c3fffd1721a941fbcf15e1 Reviewed-by: MÃ¥rten Nordheim --- src/corelib/text/qstring.cpp | 1 + .../auto/corelib/text/qstring/tst_qstring.cpp | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/src/corelib/text/qstring.cpp b/src/corelib/text/qstring.cpp index 42f5eb1a99..3f0d8db42e 100644 --- a/src/corelib/text/qstring.cpp +++ b/src/corelib/text/qstring.cpp @@ -6933,6 +6933,7 @@ QString QString::vasprintf(const char *cformat, va_list ap) int precision = -1; // -1 means unspecified if (*c == '.') { ++c; + precision = 0; if (qIsDigit(*c)) { precision = parse_field_width(c, formatEnd - c); } else if (*c == '*') { // can't parse this in another function, not portably, at least diff --git a/tests/auto/corelib/text/qstring/tst_qstring.cpp b/tests/auto/corelib/text/qstring/tst_qstring.cpp index 26bd61c248..9775a7422f 100644 --- a/tests/auto/corelib/text/qstring/tst_qstring.cpp +++ b/tests/auto/corelib/text/qstring/tst_qstring.cpp @@ -1395,6 +1395,43 @@ void tst_QString::asprintf() double d = -514.25683; QCOMPARE(QString::asprintf("%f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%.f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%.0f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%1f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%1.f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%1.0f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%1.6f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%1.10f", d), QLatin1String("-514.2568300000")); + QCOMPARE(QString::asprintf("%-1f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%-1.f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%-1.0f", d), QLatin1String("-514")); + QCOMPARE(QString::asprintf("%-1.6f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%-1.10f", d), QLatin1String("-514.2568300000")); + QCOMPARE(QString::asprintf("%10f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%10.f", d), QLatin1String(" -514")); + QCOMPARE(QString::asprintf("%10.0f", d), QLatin1String(" -514")); + QCOMPARE(QString::asprintf("%-10f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%-10.f", d), QLatin1String("-514 ")); + QCOMPARE(QString::asprintf("%-10.0f", d), QLatin1String("-514 ")); + QCOMPARE(QString::asprintf("%010f", d), QLatin1String("-514.256830")); + QCOMPARE(QString::asprintf("%010.f", d), QLatin1String("-000000514")); + QCOMPARE(QString::asprintf("%010.0f", d), QLatin1String("-000000514")); + QCOMPARE(QString::asprintf("%15f", d), QLatin1String(" -514.256830")); + QCOMPARE(QString::asprintf("%15.6f", d), QLatin1String(" -514.256830")); + QCOMPARE(QString::asprintf("%15.10f", d), QLatin1String("-514.2568300000")); + QCOMPARE(QString::asprintf("%-15f", d), QLatin1String("-514.256830 ")); + QCOMPARE(QString::asprintf("%-15.6f", d), QLatin1String("-514.256830 ")); + QCOMPARE(QString::asprintf("%-15.10f", d), QLatin1String("-514.2568300000")); + QCOMPARE(QString::asprintf("%015f", d), QLatin1String("-0000514.256830")); + QCOMPARE(QString::asprintf("%015.6f", d), QLatin1String("-0000514.256830")); + QCOMPARE(QString::asprintf("%015.10f", d), QLatin1String("-514.2568300000")); +QT_WARNING_PUSH +QT_WARNING_DISABLE_GCC("-Wformat") +QT_WARNING_DISABLE_CLANG("-Wformat") // Flag '0' ignored when flag '-' is present + QCOMPARE(QString::asprintf("%-015f", d), QLatin1String("-514.256830 ")); + QCOMPARE(QString::asprintf("%-015.6f", d), QLatin1String("-514.256830 ")); + QCOMPARE(QString::asprintf("%-015.10f", d), QLatin1String("-514.2568300000")); +QT_WARNING_POP { /* This code crashed. I don't know how to reduce it further. In other words,