[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 05/31] qobject: Document more shortcomings in our num
From: |
Markus Armbruster |
Subject: |
[Qemu-devel] [PULL 05/31] qobject: Document more shortcomings in our number handling |
Date: |
Tue, 9 Feb 2016 12:37:37 +0100 |
From: Eric Blake <address@hidden>
We've already documented that our JSON parsing is locale dependent;
but we should also document that our JSON output has the same
problem. Additionally, JSON requires finite values (you have to
upgrade to JSON5 to get support for Inf or NaN), and our output
truncates floating point numbers to the point of losing significant
precision that could cause the receiver to read a different value.
Sadly, this series is not going to be the one that addresses these
problems.
Fix some trailing whitespace I noticed in the vicinity.
Signed-off-by: Eric Blake <address@hidden>
Message-Id: <address@hidden>
Signed-off-by: Markus Armbruster <address@hidden>
---
qobject/json-parser.c | 6 ++++--
qobject/qjson.c | 11 ++++++++++-
2 files changed, 14 insertions(+), 3 deletions(-)
diff --git a/qobject/json-parser.c b/qobject/json-parser.c
index 77c9382..6c05f6c 100644
--- a/qobject/json-parser.c
+++ b/qobject/json-parser.c
@@ -1,5 +1,5 @@
/*
- * JSON Parser
+ * JSON Parser
*
* Copyright IBM, Corp. 2009
*
@@ -518,7 +518,9 @@ static QObject *parse_literal(JSONParserContext *ctxt)
/* fall through to JSON_FLOAT */
}
case JSON_FLOAT:
- /* FIXME dependent on locale */
+ /* FIXME dependent on locale; a pervasive issue in QEMU */
+ /* FIXME our lexer matches RFC 7159 in forbidding Inf or NaN,
+ * but those might be useful extensions beyond JSON */
return QOBJECT(qfloat_from_double(strtod(token->str, NULL)));
default:
abort();
diff --git a/qobject/qjson.c b/qobject/qjson.c
index b8cc4ca..06dc210 100644
--- a/qobject/qjson.c
+++ b/qobject/qjson.c
@@ -238,6 +238,15 @@ static void to_json(const QObject *obj, QString *str, int
pretty, int indent)
char buffer[1024];
int len;
+ /* FIXME: snprintf() is locale dependent; but JSON requires
+ * numbers to be formatted as if in the C locale. Dependence
+ * on C locale is a pervasive issue in QEMU. */
+ /* FIXME: This risks printing Inf or NaN, which are not valid
+ * JSON values. */
+ /* FIXME: the default precision of 6 for %f often causes
+ * rounding errors; we should be using DBL_DECIMAL_DIG (17),
+ * and only rounding to a shorter number if the result would
+ * still produce the same floating point value. */
len = snprintf(buffer, sizeof(buffer), "%f", qfloat_get_double(val));
while (len > 0 && buffer[len - 1] == '0') {
len--;
@@ -248,7 +257,7 @@ static void to_json(const QObject *obj, QString *str, int
pretty, int indent)
} else {
buffer[len] = 0;
}
-
+
qstring_append(str, buffer);
break;
}
--
2.4.3
- [Qemu-devel] [PULL 00/31] QAPI patches for 2016-02-09, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 09/31] qapi: Drop dead parameter in gen_params(), Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 03/31] Revert "tracetool: use Python 2.4-compatible exception handling syntax", Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 02/31] scripts/qmp: Use Python 2.6 "except E as ..." syntax, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 01/31] qapi: Use Python 2.6 "except E as ..." syntax, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 07/31] qapi: Drop dead dealloc visitor variable, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 05/31] qobject: Document more shortcomings in our number handling,
Markus Armbruster <=
- [Qemu-devel] [PULL 10/31] hmp: Drop pointless allocation during qapi visit, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 20/31] qapi: Don't cast Enum* to int*, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 26/31] qapi: Tighten qmp_input_end_list(), Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 30/31] qapi: Fix compilation failure on MIPS and SPARC, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 28/31] qmp: Fix reference-counting of qnull on empty output visit, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 29/31] qmp: Don't abuse stack to track qmp-output root, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 08/31] qapi: Dealloc visitor does not need a type_size(), Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 12/31] vl: Ensure qapi visitor properly ends struct visit, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 13/31] balloon: Improve use of qapi visitor, Markus Armbruster, 2016/02/09
- [Qemu-devel] [PULL 16/31] qapi-visit: Kill unused visit_end_union(), Markus Armbruster, 2016/02/09