mirror of https://github.com/google/oss-fuzz.git
94 lines
2.0 KiB
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)
|
||
|
}
|