]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/json: add a Fuzz function
authorRomain Baugue <romain.baugue@gmail.com>
Fri, 26 Apr 2019 09:55:38 +0000 (11:55 +0200)
committerBrad Fitzpatrick <bradfitz@golang.org>
Mon, 29 Apr 2019 13:20:30 +0000 (13:20 +0000)
Adds a sample Fuzz test function to package encoding/json following the
guidelines defined in #31309, based on
https://github.com/dvyukov/go-fuzz-corpus/blob/master/json/json.go

Fixes #31309
Updates #19109

Change-Id: I5fe04d9a5f41c0de339f8518dae30896ec14e356
Reviewed-on: https://go-review.googlesource.com/c/go/+/174058
Reviewed-by: Dmitry Vyukov <dvyukov@google.com>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Dmitry Vyukov <dvyukov@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/encoding/json/fuzz.go [new file with mode: 0644]

diff --git a/src/encoding/json/fuzz.go b/src/encoding/json/fuzz.go
new file mode 100644 (file)
index 0000000..4872b6f
--- /dev/null
@@ -0,0 +1,42 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build gofuzz
+
+package json
+
+import (
+       "fmt"
+)
+
+func Fuzz(data []byte) (score int) {
+       for _, ctor := range []func() interface{}{
+               func() interface{} { return new(interface{}) },
+               func() interface{} { return new(map[string]interface{}) },
+               func() interface{} { return new([]interface{}) },
+       } {
+               v := ctor()
+               err := Unmarshal(data, v)
+               if err != nil {
+                       continue
+               }
+               score = 1
+
+               m, err := Marshal(v)
+               if err != nil {
+                       fmt.Printf("v=%#v\n", v)
+                       panic(err)
+               }
+
+               u := ctor()
+               err = Unmarshal(m, u)
+               if err != nil {
+                       fmt.Printf("v=%#v\n", v)
+                       fmt.Println("m=%s\n", string(m))
+                       panic(err)
+               }
+       }
+
+       return
+}