// Copyright 2015 go-fuzz project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE. // Modified from original file https://github.com/dvyukov/go-fuzz-corpus/blob/master/json/json.go package jsonfuzz import ( "encoding/json" "fmt" jsoniter "github.com/json-iterator/go" "reflect" ) func Fuzz(data []byte) int { score := 0 for _, ctor := range []func() interface{}{ //func() interface{} { return nil }, func() interface{} { return new([]interface{}) }, func() interface{} { m := map[string]string{}; return &m }, func() interface{} { m := map[string]interface{}{}; return &m }, func() interface{} { return new(S) }, } { v := ctor() if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, v) != nil { continue } score = 1 vj := ctor() err := json.Unmarshal(data, vj) if err != nil { panic(err) } if !reflect.DeepEqual(v, vj) { fmt.Printf("v0: %#v\n", v) fmt.Printf("v1: %#v\n", vj) panic("not equal") } data1, err := jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(v) if err != nil { panic(err) } v1 := ctor() if jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data1, v1) != nil { continue } if !reflect.DeepEqual(v, v1) { fmt.Printf("v0: %#v\n", v) fmt.Printf("v1: %#v\n", v1) panic("not equal") } } return score } type S struct { A int `json:",omitempty"` B string `json:"B1,omitempty"` C float64 D bool E uint8 F []byte G interface{} H map[string]interface{} I map[string]string J []interface{} K []string L S1 M *S1 N *int O **int // P json.RawMessage Q Marshaller R int `json:"-"` S int `json:",string"` } type S1 struct { A int B string } type Marshaller struct { v string } func (m *Marshaller) MarshalJSON() ([]byte, error) { return jsoniter.ConfigCompatibleWithStandardLibrary.Marshal(m.v) } func (m *Marshaller) UnmarshalJSON(data []byte) error { return jsoniter.ConfigCompatibleWithStandardLibrary.Unmarshal(data, &m.v) }