mirror of
https://github.com/golang/go
synced 2024-10-04 15:09:59 +00:00
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:
parent
bd71dee2b4
commit
5003ed884a
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue