Red Hat Bugzilla – Bug 1028511
json-c: double handling issues (accuracy, thread safety)
Last modified: 2015-12-17 05:36:02 EST
json_object_double_to_json_string() uses the %f conversion specifier to convert a double to a string: size = snprintf(buf, 128, "%f", jso->o.c_double); p = strchr(buf, ','); if (p) { *p = '.'; } else { p = strchr(buf, '.'); } This is lossy, it does not preserve all significant digits. Exact conversion between binary and decimal floating point is difficult, and json-c should probably use gdtoa or grisu to implement this. That would ensure nice-looking but accurate output, but it's a lot of code. There is a width (18?) that ensures that %s is completely accurate, but I don't have the details at hand right now. The decimal comma rewriting is also a bit suspect, but I couldn't get it to fail in a fa_IR locale (which is supposed to have neither a decimal point nor a decimal comma).
Decoding is not thread-safe because it switches the process LC_NUMERIC locale to C temporarily. I strongly suspect this is done for the benefit of double parsing with sscanf, so it is related to this issue.
The accuracy issue is addressed in this upstream commit (assuming that "17" is large enough to preserve all digits, I haven't checked that). https://github.com/json-c/json-c/commit/06450206c4f3de4af8d81bb6d93e9db1d5fedec1
Reported upstream: https://github.com/json-c/json-c/issues/195