From 7b9ccc3f35c2eb528e4a901d61fb47d382015d7f Mon Sep 17 00:00:00 2001 From: "duanyi.aster" Date: Fri, 19 Jan 2024 20:56:16 +0800 Subject: [PATCH] more fuzz --- fuzz/Makefile | 2 +- fuzz/ast_fuzz_test.go | 21 +++++++++++----- fuzz/fuzz_test.go | 58 +++++++++++++++++++++---------------------- 3 files changed, 45 insertions(+), 36 deletions(-) diff --git a/fuzz/Makefile b/fuzz/Makefile index 36d500fbd..91b5af2f9 100644 --- a/fuzz/Makefile +++ b/fuzz/Makefile @@ -9,7 +9,7 @@ fuzz: file2fuzz -o ${corpusdir} ./go-fuzz-corpus/json/corpus/* ./corpus/* run: - SONIC_FUZZ_MEM_LIMIT=2 GOMAXPROCS=4 GOARCH=amd64 go test -fuzz=${testname} -v -fuzztime 5m + SONIC_FUZZ_MEM_LIMIT=2 GOMAXPROCS=4 GOARCH=amd64 go test -fuzz=${testname} -v -fuzztime 10m clean: rm -rf ./go-fuzz-corpus/ diff --git a/fuzz/ast_fuzz_test.go b/fuzz/ast_fuzz_test.go index 35c356094..9307f189d 100644 --- a/fuzz/ast_fuzz_test.go +++ b/fuzz/ast_fuzz_test.go @@ -24,6 +24,7 @@ import ( "testing" "github.com/bytedance/sonic" + "github.com/bytedance/sonic/ast" "github.com/davecgh/go-spew/spew" "github.com/stretchr/testify/require" ) @@ -50,21 +51,29 @@ func fuzzASTGetFromObject(t *testing.T, v []byte, m map[string]interface{}) { nn, _ := sonic.GetValueFromString(nj) nv, err := nn.Interface() require.NoErrorf(t, err, "error in node set\n%s", msg) - require.Equal(t, m, nv) + require.Equalf(t, m, nv, msg) } } -func fuzzASTGetFromArray(t *testing.T, data []byte, a []interface{}) { +func fuzzASTGetFromArray(t *testing.T, v []byte, a []interface{}) { i := 0 + data := string(v) for ; i < len(a); i++ { msg := fmt.Sprintf("Data:\n%s\nIndex:\n%d\n", spew.Sdump(data), i) - node, err := sonic.GetValue(data, i) + node, err := sonic.GetValueFromString(data, i) require.NoErrorf(t, err, "error in ast get index\n%s", msg) v, err := node.Interface() require.NoErrorf(t, err, "error in node convert\n%s", msg) - require.Equalf(t, v, a[i], "error in node equal\n%sGot:\n%s\nExp:\n%s\n", - msg, spew.Sdump(v), spew.Sdump(a[i])) + require.Equalf(t, v, a[i], "error in node equal\n%sGot:\n%s\nExp:\n%s\n", msg, spew.Sdump(v), spew.Sdump(a[i])) + next, err := sonic.DeleteFromString(data, i) + require.NoErrorf(t, err, "error in node delete\n%s", msg) + nj := ast.NewValueJSON(next) + err = nj.AddAny(i, v) + require.NoErrorf(t, err, "error in node add\n%s", msg) + nv, err := nj.Interface() + require.NoErrorf(t, err, "error in node set\n%s", msg) + require.Equalf(t, a, nv, msg) } - _, err := sonic.GetValue(data, i) + _, err := sonic.GetValueFromString(data, i) require.Errorf(t, err, "no error in ast get out of range\nData:\n%s\n", spew.Sdump(data)) } \ No newline at end of file diff --git a/fuzz/fuzz_test.go b/fuzz/fuzz_test.go index 2eb0ec1c4..36588b217 100644 --- a/fuzz/fuzz_test.go +++ b/fuzz/fuzz_test.go @@ -53,16 +53,16 @@ func TestCorpus(t *testing.T) { var target = sonic.ConfigStd func fuzzMain(t *testing.T, data []byte) { - // fuzzValidate(t, data) - // fuzzHtmlEscape(t, data) + fuzzValidate(t, data) + fuzzHtmlEscape(t, data) // fuzz ast get api, should not panic here. fuzzAst(t, data) // Only fuzz the validate json here. if !json.Valid(data) { return } - // fuzzStream(t, data) - for _, typ := range []func() interface{}{ + fuzzStream(t, data) + for i, typ := range []func() interface{}{ func() interface{} { return new(interface{}) }, func() interface{} { return new(map[string]interface{}) }, func() interface{} { return new([]interface{}) }, @@ -90,33 +90,33 @@ func fuzzMain(t *testing.T, data []byte) { require.NoError(t, serr, dump(v, jout, jerr, sout, serr)) require.NoError(t, jerr, dump(v, jout, jerr, sout, serr)) - // { - // sv, jv = typ(), typ() - // serr := target.Unmarshal(sout, sv) - // jerr := json.Unmarshal(jout, jv) - // require.Equalf(t, serr != nil, jerr != nil, dump(data, jv, jerr, sv, serr)) - // if jerr != nil { - // continue - // } - // require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr)) - // } - - // // fuzz ast MarshalJSON API - // if i == 0 { - // root, aerr := sonic.Get(data) - // require.Equal(t, aerr, nil) - // aerr = root.LoadAll() - // require.Equal(t, aerr, nil, dump(data, jv, jerr, root, aerr)) - // aout, aerr := root.MarshalJSON() - // require.Equal(t, aerr, nil) - // sv = typ() - // serr := json.Unmarshal(aout, sv) - // require.Equal(t, serr, nil) - // require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr)) - // } + { + sv, jv = typ(), typ() + serr := target.Unmarshal(sout, sv) + jerr := json.Unmarshal(jout, jv) + require.Equalf(t, serr != nil, jerr != nil, dump(data, jv, jerr, sv, serr)) + if jerr != nil { + continue + } + require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr)) + } + + // fuzz ast MarshalJSON API + if i == 0 { + root, aerr := sonic.Get(data) + require.Equal(t, aerr, nil) + aerr = root.LoadAll() + require.Equal(t, aerr, nil, dump(data, jv, jerr, root, aerr)) + aout, aerr := root.MarshalJSON() + require.Equal(t, aerr, nil) + sv = typ() + serr := json.Unmarshal(aout, sv) + require.Equal(t, serr, nil) + require.Equal(t, sv, jv, dump(data, jv, jerr, sv, serr)) + } if m, ok := sv.(*map[string]interface{}); ok { - // fuzzDynamicStruct(t, jout, *m) + fuzzDynamicStruct(t, jout, *m) fuzzASTGetFromObject(t, jout, *m) } if a, ok := sv.(*[]interface{}); ok {