11#![ no_main]
22#![ allow( clippy:: mutable_key_type) ]
3+ use std:: { borrow:: Cow , collections:: HashMap , hash:: Hash , marker:: PhantomData } ;
34
5+ use faststr:: FastStr ;
46use libfuzzer_sys:: fuzz_target;
7+ use serde:: { Deserialize , Serialize } ;
58use serde_json:: Value as JValue ;
69use sonic_rs:: {
710 from_slice, from_str, to_array_iter, to_array_iter_unchecked, to_object_iter,
8- to_object_iter_unchecked, value:: JsonContainerTrait , JsonNumberTrait , JsonValueTrait , Value ,
11+ to_object_iter_unchecked, value:: JsonContainerTrait , Deserializer , JsonNumberTrait ,
12+ JsonValueTrait , Value ,
913} ;
1014
1115macro_rules! test_type {
@@ -54,8 +58,8 @@ fuzz_target!(|data: &[u8]| {
5458 let sv2: Value = from_str( & sout) . unwrap( ) ;
5559 let eq = compare_value( & jv2, & sv2) ;
5660
57- // compare use raw
5861 fuzz_use_raw( data, & sv) ;
62+ fuzz_utf8_lossy( data, & sv) ;
5963
6064 if jv. is_object( ) && eq {
6165 for ret in to_object_iter( data) {
@@ -119,7 +123,6 @@ fn compare_lazyvalue(jv: &JValue, sv: &sonic_rs::LazyValue) {
119123}
120124
121125fn fuzz_use_raw ( json : & [ u8 ] , sv : & sonic_rs:: Value ) {
122- use sonic_rs:: { Deserialize , Deserializer , Value } ;
123126 let json = unsafe { std:: str:: from_utf8_unchecked ( json) } ;
124127 let mut de = Deserializer :: from_str ( json) . use_raw ( ) ;
125128 let value: Value = Deserialize :: deserialize ( & mut de) . unwrap ( ) ;
@@ -128,6 +131,15 @@ fn fuzz_use_raw(json: &[u8], sv: &sonic_rs::Value) {
128131 assert_eq ! ( & got, sv) ;
129132}
130133
134+ fn fuzz_utf8_lossy ( json : & [ u8 ] , sv : & sonic_rs:: Value ) {
135+ let json = unsafe { std:: str:: from_utf8_unchecked ( json) } ;
136+ let mut de = Deserializer :: from_str ( json) . utf8_lossy ( ) ;
137+ let value: Value = Deserialize :: deserialize ( & mut de) . unwrap ( ) ;
138+ let out = sonic_rs:: to_string ( & value) . unwrap ( ) ;
139+ let got: Value = sonic_rs:: from_str ( & out) . unwrap ( ) ;
140+ assert_eq ! ( & got, sv) ;
141+ }
142+
131143fn compare_value ( jv : & JValue , sv : & sonic_rs:: Value ) -> bool {
132144 match * jv {
133145 JValue :: Object ( ref obj) => {
@@ -175,11 +187,6 @@ fn compare_value(jv: &JValue, sv: &sonic_rs::Value) -> bool {
175187 true
176188}
177189
178- use std:: { borrow:: Cow , collections:: HashMap , hash:: Hash , marker:: PhantomData } ;
179-
180- use faststr:: FastStr ;
181- use serde:: { Deserialize , Serialize } ;
182-
183190#[ derive( Debug , Deserialize , Serialize , PartialEq ) ]
184191struct Foo {
185192 name : FastStr ,
0 commit comments