diff options
author | Christian Kandeler <christian.kandeler@qt.io> | 2018-04-23 14:40:58 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@qt.io> | 2018-04-24 07:41:17 +0000 |
commit | 501bb599bfcfa7b98227f7fc295cd8e0a09bc927 (patch) | |
tree | 6bda5fc4eb7e44f58d118bb9397ac3e6ae4e321c | |
parent | 3653385af94ae7fe042d1c4845293b495bdc9854 (diff) |
Command line parser: Don't accidentally create floating-point values
This could easily happen; e.g. a property assignment such as "version:
10.10" would result in the version property getting the value "10.1".
While users could work around that, the behavior was rather surprising.
We claim that no floating-point values are ever assigned to properties
and force such values to get parsed as strings.
Task-number: QBS-1242
Change-Id: I0e21cefaed11de1553cb3ed085280adfb489a1a7
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
4 files changed, 22 insertions, 1 deletions
diff --git a/src/lib/corelib/tools/settingsrepresentation.cpp b/src/lib/corelib/tools/settingsrepresentation.cpp index f977fbd9f..256c60c0e 100644 --- a/src/lib/corelib/tools/settingsrepresentation.cpp +++ b/src/lib/corelib/tools/settingsrepresentation.cpp @@ -64,7 +64,14 @@ static QVariant variantFromString(const QString &str, bool &ok) QVariant representationToSettingsValue(const QString &representation) { bool ok; - const QVariant variant = variantFromString(representation, ok); + QVariant variant = variantFromString(representation, ok); + + // We have no floating-point properties, so this is most likely intended to be a string. + if (static_cast<QMetaType::Type>(variant.type()) == QMetaType::Float + || static_cast<QMetaType::Type>(variant.type()) == QMetaType::Double) { + variant = variantFromString(QLatin1Char('"') + representation + QLatin1Char('"'), ok); + } + if (ok) return variant; diff --git a/tests/auto/blackbox/testdata/prevent-floating-point-values/prevent-floating-point-values.qbs b/tests/auto/blackbox/testdata/prevent-floating-point-values/prevent-floating-point-values.qbs new file mode 100644 index 000000000..619e44f20 --- /dev/null +++ b/tests/auto/blackbox/testdata/prevent-floating-point-values/prevent-floating-point-values.qbs @@ -0,0 +1,6 @@ +import qbs + +Product { + name: "p" + property bool dummy: { console.info("version: " + version); } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index bc3e103a7..933dfe79f 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -2617,6 +2617,13 @@ void TestBlackbox::precompiledAndPrefixHeaders() QCOMPARE(runQbs(), 0); } +void TestBlackbox::preventFloatingPointValues() +{ + QDir::setCurrent(testDataDir + "/prevent-floating-point-values"); + QCOMPARE(runQbs(QStringList("products.p.version:1.50")), 0); + QVERIFY2(m_qbsStdout.contains("version: 1.50"), m_qbsStdout.constData()); +} + void TestBlackbox::probeChangeTracking() { QDir::setCurrent(testDataDir + "/probe-change-tracking"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index a1b5dcc0b..ac515d0c0 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -179,6 +179,7 @@ private slots: void pkgConfigProbeSysroot(); void pluginDependency(); void precompiledAndPrefixHeaders(); + void preventFloatingPointValues(); void probeChangeTracking(); void probeProperties(); void probeInExportedModule(); |