Skip to content

Commit dc232b9

Browse files
authored
javy-fuzz: Compare values instead of strings. (#706)
This commit introduces value comparison for the json-differential target. The motivation behind this change is to overcome the complexity of float value formatting. JavaScript has very complex rules for Number formatting, for example, numbers that have magnitude of 10^21, independent of the sign, will be formatted via scientific notation. I was able to achieve certain format parity by writing a custom serde serializer formatter and relying on crates like `ryu` and `lexical`. Even though this worked to an extent, there are some unwritten rules to my knowledge that make it harder to achieve full formatting parity. For example, in some cases the scientific notation would include the exponent with a sign e.g., `e+` or `e-` depending on how big the number is. In the case of `lexical` or `ryu` even though the numerical value is the same, no signs are used, which makes it harder to perform differential testing. Having to post-process the resulting string, will most likely incur in a performance penalty that I'm not sure is worth, especially given that no issues have been reported regarding the numerical value during my testing. Due to all this reasons, this commit switches toward value comparison rahter than format/string comparison by parsing the stringified JSON into `serde_json::Value` and asserting equality on top of it.
1 parent 51a6da5 commit dc232b9

File tree

1 file changed

+4
-2
lines changed

1 file changed

+4
-2
lines changed

fuzz/fuzz_targets/json_differential.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ fn exec(data: &ArbitraryValue) -> Result<()> {
4848
panic!("{}\n{}", from_js_error(cx.clone(), e), **data,);
4949
}
5050

51-
output = globals.get("OUTPUT")?;
51+
let result: String = globals.get("OUTPUT")?;
52+
output = serde_json::from_str(&result).ok();
5253

5354
Ok::<(), Error>(())
5455
})?;
@@ -63,7 +64,8 @@ fn exec(data: &ArbitraryValue) -> Result<()> {
6364
panic!("{}\n{}", from_js_error(cx.clone(), e), **data);
6465
}
6566

66-
ref_output = globals.get("OUTPUT")?;
67+
let result: String = globals.get("OUTPUT")?;
68+
ref_output = serde_json::from_str(&result).ok();
6769

6870
Ok::<(), Error>(())
6971
})?;

0 commit comments

Comments
 (0)