93 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			1.9 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 jsoniter
 | 
						|
 | 
						|
import (
 | 
						|
	"encoding/json"
 | 
						|
	"fmt"
 | 
						|
	"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 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 := ConfigCompatibleWithStandardLibrary.Marshal(v)
 | 
						|
		if err != nil {
 | 
						|
			panic(err)
 | 
						|
		}
 | 
						|
		v1 := ctor()
 | 
						|
		if 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 ConfigCompatibleWithStandardLibrary.Marshal(m.v)
 | 
						|
}
 | 
						|
 | 
						|
func (m *Marshaller) UnmarshalJSON(data []byte) error {
 | 
						|
	return ConfigCompatibleWithStandardLibrary.Unmarshal(data, &m.v)
 | 
						|
}
 |