aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2026-02-11 10:59:45 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2026-02-21 02:41:06 +0000
commit120faedead252a16b4b9bf847a5f5c75f8aac604 (patch)
treeb73130be799c89a521aac32b04236e101bead86a
parentd4cb3214334012d34e56c086624ee5acba3cd155 (diff)
QJSPrimitiveValue: silence division by zero warning
Division by zero is UB in C++, even for floats, as the floating point representation is undefined. We need however the IEC559 behavior, as that is what ECMAScript mandates. We assume compilers are doing the sane thing here, so we static_assert that numeric_limits::is_iec559 holds, as silence MSVC's warning. Pick-to: 6.8 Change-Id: Ie1f5e8824d65933c669175d3c6431baa4ff685d6 Reviewed-by: Ulf Hermann <ulf.hermann@qt.io> (cherry picked from commit d49842bb9badf57374ad4e4aa96b1377c923a4e9) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> (cherry picked from commit 98306f01bcf7003df754a4807016bc2a00e254cc)
-rw-r--r--src/qml/jsapi/qjsprimitivevalue.h12
-rw-r--r--tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp19
2 files changed, 30 insertions, 1 deletions
diff --git a/src/qml/jsapi/qjsprimitivevalue.h b/src/qml/jsapi/qjsprimitivevalue.h
index f7762c19b8..c01549fb9d 100644
--- a/src/qml/jsapi/qjsprimitivevalue.h
+++ b/src/qml/jsapi/qjsprimitivevalue.h
@@ -105,7 +105,17 @@ class QJSPrimitiveValue
};
struct DivOperators : private StringNaNOperators<DivOperators> {
- static constexpr double op(double lhs, double rhs) { return lhs / rhs; }
+ static constexpr double op(double lhs, double rhs) {
+ // Without is_iec559, we don't get proper JS semantics
+#ifndef Q_OS_INTEGRITY
+ static_assert(std::numeric_limits<double>::is_iec559);
+#endif
+ QT_WARNING_PUSH
+ // divide by zero: not an issue with iec559
+ QT_WARNING_DISABLE_MSVC(4723)
+ return lhs / rhs;
+ QT_WARNING_POP
+ }
static constexpr bool opOverflow(int, int, int *)
{
return true;
diff --git a/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp b/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp
index 986dc9a40e..3fbfcd6838 100644
--- a/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp
+++ b/tests/auto/qml/qjsprimitivevalue/tst_qjsprimitivevalue.cpp
@@ -27,6 +27,7 @@ private slots:
void ctor_intWithEngine();
void ctor_stringWithEngine();
void ctor_copyAndAssignWithEngine();
+ void divisionByZero();
void toString();
void toNumber();
void toBoolean();
@@ -444,6 +445,24 @@ void tst_QJSPrimitiveValue::ctor_copyAndAssignWithEngine()
QCOMPARE(v5.toDouble(), 1.0);
}
+void tst_QJSPrimitiveValue::divisionByZero()
+{
+ QJSPrimitiveValue zero(0.0);
+ QJSPrimitiveValue pos(1);
+ QJSPrimitiveValue neg(-1);
+
+ QJSPrimitiveValue quietNan = zero / zero;
+ QVERIFY(qIsNaN(quietNan.toDouble()));
+
+ QJSPrimitiveValue inf = pos / zero;
+ QVERIFY(qIsInf(inf.toDouble()));
+ QCOMPARE_GT(inf, 0);
+
+ QJSPrimitiveValue ninf = neg / zero;
+ QVERIFY(qIsInf(ninf.toDouble()));
+ QCOMPARE_LT(ninf, 0);
+}
+
void tst_QJSPrimitiveValue::toString()
{
QJSEngine eng;