internal/fuzz: minimization should not reduce coverage

Minimization should result in a fuzz input which
includes the same coverage bits as the original
input.

Updates #48326

Change-Id: I6c5f30058b57ccd1a096ad0e9452a4dfbb7d9aab
Reviewed-on: https://go-review.googlesource.com/c/go/+/391454
Trust: Bryan Mills <bcmills@google.com>
Reviewed-by: Roland Shoemaker <roland@golang.org>
Run-TryBot: Roland Shoemaker <roland@golang.org>
Auto-Submit: Roland Shoemaker <roland@golang.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Steven Johnstone 2022-03-10 13:38:00 +00:00 committed by Gopher Robot
parent bd71dee2b4
commit 5003ed884a
3 changed files with 13 additions and 12 deletions

View file

@ -127,19 +127,8 @@ func FuzzMinCache(f *testing.F) {
if bytes.Equal(buf, seed) { if bytes.Equal(buf, seed) {
return return
} }
if n := sum(buf); n < 0 {
t.Error("sum cannot be negative")
}
}) })
} }
func sum(buf []byte) int {
n := 0
for _, b := range buf {
n += int(b)
}
return n
}
-- check_testdata/check_testdata.go -- -- check_testdata/check_testdata.go --
//go:build ignore //go:build ignore
// +build ignore // +build ignore

View file

@ -66,6 +66,17 @@ func countNewCoverageBits(base, snapshot []byte) int {
return n return n
} }
// isCoverageSubset returns true if all the base coverage bits are set in
// snapshot
func isCoverageSubset(base, snapshot []byte) bool {
for i, v := range base {
if v&snapshot[i] != v {
return false
}
}
return true
}
// hasCoverageBit returns true if snapshot has at least one bit set that is // hasCoverageBit returns true if snapshot has at least one bit set that is
// also set in base. // also set in base.
func hasCoverageBit(base, snapshot []byte) bool { func hasCoverageBit(base, snapshot []byte) bool {

View file

@ -894,7 +894,8 @@ func (ws *workerServer) minimizeInput(ctx context.Context, vals []any, mem *shar
} }
return true return true
} }
if keepCoverage != nil && hasCoverageBit(keepCoverage, coverageSnapshot) { // Minimization should preserve coverage bits.
if keepCoverage != nil && isCoverageSubset(keepCoverage, coverageSnapshot) {
return true return true
} }
vals[args.Index] = prev vals[args.Index] = prev