oss-fuzz/projects/go-json-iterator/fuzz_json.go

94 lines
2.0 KiB
Go

// 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)
}