diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2019-04-01 12:20:19 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-04-01 12:20:19 +0200 |
| commit | 44fe9159be031342cb956bde7dc3f3fa0340d9af (patch) | |
| tree | 234a97e0f1c423bbf9c812497b0bad337cbe9060 /prog/test | |
| parent | 36b433b718e36d924005b19a1d1525c928171aff (diff) | |
prog/test: rename prog/fuzz to prog/test
gometalinter complained about fuzz.FuzzFoo names,
but go-fuzz now requires all fuzz functions to start with Fuzz.
So move the package to prog/test.
Diffstat (limited to 'prog/test')
| -rw-r--r-- | prog/test/fuzz.go | 74 | ||||
| -rw-r--r-- | prog/test/fuzz_test.go | 30 |
2 files changed, 104 insertions, 0 deletions
diff --git a/prog/test/fuzz.go b/prog/test/fuzz.go new file mode 100644 index 000000000..e86509237 --- /dev/null +++ b/prog/test/fuzz.go @@ -0,0 +1,74 @@ +// Copyright 2019 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package test + +import ( + "bytes" + "fmt" + "math/rand" + + "github.com/google/syzkaller/prog" + _ "github.com/google/syzkaller/sys/test/gen" // import the target we use for fuzzing +) + +func FuzzDeserialize(data []byte) int { + p0, err0 := fuzzTarget.Deserialize(data, prog.NonStrict) + p1, err1 := fuzzTarget.Deserialize(data, prog.Strict) + if p0 == nil { + if p1 != nil { + panic("NonStrict is stricter than Strict") + } + if err0 == nil || err1 == nil { + panic("no error") + } + return 0 + } + if err0 != nil { + panic("got program and error") + } + data0 := p0.Serialize() + if p1 != nil { + if err1 != nil { + panic("got program and error") + } + if !bytes.Equal(data0, p1.Serialize()) { + panic("got different data") + } + } + p2, err2 := fuzzTarget.Deserialize(data0, prog.NonStrict) + if err2 != nil { + panic(fmt.Sprintf("failed to parse serialized: %v\n%s", err2, data0)) + } + if !bytes.Equal(data0, p2.Serialize()) { + panic("got different data") + } + p3 := p0.Clone() + if !bytes.Equal(data0, p3.Serialize()) { + panic("got different data") + } + if n, err := p0.SerializeForExec(fuzzBuffer); err == nil { + if _, err := fuzzTarget.DeserializeExec(fuzzBuffer[:n]); err != nil { + panic(err) + } + } + p3.Mutate(rand.NewSource(0), 3, nil, nil) + return 0 +} + +func FuzzParseLog(data []byte) int { + if len(fuzzTarget.ParseLog(data)) != 0 { + return 1 + } + return 0 +} + +var fuzzBuffer = make([]byte, prog.ExecBufferSize) +var fuzzTarget = func() *prog.Target { + prog.Debug() + target, err := prog.GetTarget("test", "64") + if err != nil { + panic(err) + } + return target +}() diff --git a/prog/test/fuzz_test.go b/prog/test/fuzz_test.go new file mode 100644 index 000000000..22c4066df --- /dev/null +++ b/prog/test/fuzz_test.go @@ -0,0 +1,30 @@ +// Copyright 2019 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package test + +import ( + "testing" +) + +func TestFuzz(t *testing.T) { + for i, data := range []string{ + `test$length10(&200000000000009`, + `test$str0(&(0x7f0000000000)='\xz+')`, + `syz_compare(&AUTO=""/81546506777")`, + `syz_compare(&AUTO=""/190734863281259)`, + `syz_compare(&AUTO=""/500000)`, + `test$vma0(&(0x7f0000000000)=0)`, + `test$vma0(&(0x7f0000000000)=')`, + `test$length10(&(0x7f0000009000),AUTO)`, + `syz_compare(&AUTO=""/2712404) +mutate4() +mutate7() +mutate8() +`, + } { + t.Logf("test #%v: %q", i, string(data)) + FuzzDeserialize([]byte(data)) + FuzzParseLog([]byte(data)) + } +} |
