aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2018-04-23 14:40:58 +0200
committerChristian Kandeler <christian.kandeler@qt.io>2018-04-24 07:41:17 +0000
commit501bb599bfcfa7b98227f7fc295cd8e0a09bc927 (patch)
tree6bda5fc4eb7e44f58d118bb9397ac3e6ae4e321c
parent3653385af94ae7fe042d1c4845293b495bdc9854 (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>
-rw-r--r--src/lib/corelib/tools/settingsrepresentation.cpp9
-rw-r--r--tests/auto/blackbox/testdata/prevent-floating-point-values/prevent-floating-point-values.qbs6
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp7
-rw-r--r--tests/auto/blackbox/tst_blackbox.h1
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();