mirror of
https://github.com/protocolbuffers/protobuf-go.git
synced 2024-12-26 21:24:22 +00:00
internal/fuzz: add basic fuzzing target for Marshal/Unmarshal
Change-Id: Ibc4e1d53958abd0973fd568e9dafd5be9a8bdc0d Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/200537 Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
This commit is contained in:
parent
d01061a42e
commit
591f09ab7c
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,6 +6,7 @@
|
||||
/cmd/protoc-gen-go-grpc/protoc-gen-go-grpc
|
||||
/cmd/protoc-gen-go-grpc/testdata/go.sum
|
||||
/vendor
|
||||
/internal/fuzz/wire/fuzz-fuzz.zip
|
||||
|
||||
# This file includes artifacts of the system test that should not be checked in.
|
||||
# For files created by specific development environment (e.g. editor),
|
||||
|
12
internal/fuzz/README.md
Normal file
12
internal/fuzz/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Fuzzing
|
||||
|
||||
Fuzzing support using [go-fuzz](https://github.com/dvyukov/go-fuzz).
|
||||
|
||||
Basic operation:
|
||||
|
||||
```sh
|
||||
$ go install github.com/dvyukov/go-fuzz/go-fuzz github.com/dvyukov/go-fuzz/go-fuzz-build
|
||||
$ cd internal/fuzz/{fuzzer}
|
||||
$ GOFUZZ111MODULE=on go-fuzz-build .
|
||||
$ go-fuzz
|
||||
```
|
40
internal/fuzz/wire/fuzz.go
Normal file
40
internal/fuzz/wire/fuzz.go
Normal file
@ -0,0 +1,40 @@
|
||||
// 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 wire includes a fuzzer for the wire marshaler and unmarshaler.
|
||||
package wire
|
||||
|
||||
import (
|
||||
"google.golang.org/protobuf/proto"
|
||||
|
||||
testpb "google.golang.org/protobuf/internal/testprotos/test"
|
||||
)
|
||||
|
||||
// Fuzz is a fuzzer for proto.Marshal and proto.Unmarshal.
|
||||
func Fuzz(data []byte) int {
|
||||
score := 0
|
||||
for _, newf := range []func() proto.Message{
|
||||
func() proto.Message { return &testpb.TestAllTypes{} },
|
||||
} {
|
||||
m1 := newf()
|
||||
if err := proto.Unmarshal(data, m1); err != nil {
|
||||
continue
|
||||
}
|
||||
score = 1
|
||||
data1, err := proto.Marshal(m1)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
m2 := newf()
|
||||
if err := proto.Unmarshal(data1, m2); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if !proto.Equal(m1, m2) {
|
||||
panic("not equal")
|
||||
}
|
||||
}
|
||||
return score
|
||||
}
|
Loading…
Reference in New Issue
Block a user