|
1 | 1 | #![no_main] |
2 | 2 |
|
3 | | -use arbitrary::Arbitrary; |
| 3 | +use arbitrary_json::ArbitraryValue; |
4 | 4 | use ijson::IValue; |
5 | 5 | use libfuzzer_sys::fuzz_target; |
6 | 6 | use serde::Deserialize; |
7 | | -use std::collections::HashMap; |
8 | 7 |
|
9 | | -#[derive(Arbitrary, Debug)] |
10 | | -enum JsonValue { |
11 | | - Null, |
12 | | - Bool(bool), |
13 | | - Number(f64), |
14 | | - String(String), |
15 | | - Array(Vec<JsonValue>), |
16 | | - Object(HashMap<String, JsonValue>), |
17 | | -} |
18 | | - |
19 | | -impl JsonValue { |
20 | | - fn to_json_string(&self) -> String { |
21 | | - match self { |
22 | | - JsonValue::Null => "null".to_string(), |
23 | | - JsonValue::Bool(b) => b.to_string(), |
24 | | - JsonValue::Number(n) => { |
25 | | - if n.is_finite() { |
26 | | - n.to_string() |
27 | | - } else { |
28 | | - "0".to_string() |
29 | | - } |
30 | | - } |
31 | | - JsonValue::String(s) => format!("\"{}\"", s), |
32 | | - JsonValue::Array(arr) => { |
33 | | - let items: Vec<String> = arr.iter().map(|v| v.to_json_string()).collect(); |
34 | | - format!("[{}]", items.join(",")) |
35 | | - } |
36 | | - JsonValue::Object(obj) => { |
37 | | - let items: Vec<String> = obj |
38 | | - .iter() |
39 | | - .map(|(k, v)| { |
40 | | - let key = k.clone(); |
41 | | - format!("\"{}\":{}", key, v.to_json_string()) |
42 | | - }) |
43 | | - .collect(); |
44 | | - format!("{{{}}}", items.join(",")) |
45 | | - } |
46 | | - } |
47 | | - } |
48 | | -} |
49 | | - |
50 | | -fuzz_target!(|value: JsonValue| { |
51 | | - let json_string = value.to_json_string(); |
| 8 | +fuzz_target!(|value: ArbitraryValue| { |
| 9 | + let json_string = value.to_string(); |
52 | 10 | let mut deserializer = serde_json::Deserializer::from_str(&json_string); |
53 | 11 | let _ = IValue::deserialize(&mut deserializer); |
54 | 12 | }); |
0 commit comments