mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
[dev.fuzz] internal/fuzz: implement coverage and trace instrumentation
This CL makes two main changes to allow internal/fuzz to support -d=libfuzzer instrumentation: 1. It extends cmd/link to define _counters and _ecounters symbols so internal/fuzz can find the coverage counters. 2. It adds "trace" stub functions that implement the ABI expected by cmd/compile for comparison instrumentation. N.B., that -tags=libfuzzer should *not* be set, so that internal/fuzz's trace routines will be used instead of runtime's libfuzzer trampolines. Also, the current implementation doesn't support multi-module builds (i.e., compiling a Go program that spans multiple .so/.dll files). Presumably this isn't an issue, since "go test -fuzz" will need to recompile the binary with instrumentation anyway so it can make sure to always use a single-module build. But we can revisit this if necessary. Change-Id: I9b1619119ab7477bebcfd5988b4b60499a7ab0d7 Reviewed-on: https://go-review.googlesource.com/c/go/+/308289 Trust: Matthew Dempsky <mdempsky@google.com> Trust: Katie Hockman <katie@golang.org> Reviewed-by: Katie Hockman <katie@golang.org> Reviewed-by: Jay Conrod <jayconrod@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> Run-TryBot: Katie Hockman <katie@golang.org> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
2f3bc725fe
commit
74f49f3366
3 changed files with 67 additions and 9 deletions
|
|
@ -4,8 +4,29 @@
|
|||
|
||||
package fuzz
|
||||
|
||||
import (
|
||||
"internal/unsafeheader"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// coverage returns a []byte containing unique 8-bit counters for each edge of
|
||||
// the instrumented source code. This coverage data will only be generated if
|
||||
// `-d=libfuzzer` is set at build time. This can be used to understand the code
|
||||
// coverage of a test execution.
|
||||
func coverage() []byte { return nil }
|
||||
func coverage() []byte {
|
||||
addr := unsafe.Pointer(&_counters)
|
||||
size := uintptr(unsafe.Pointer(&_ecounters)) - uintptr(addr)
|
||||
|
||||
var res []byte
|
||||
*(*unsafeheader.Slice)(unsafe.Pointer(&res)) = unsafeheader.Slice{
|
||||
Data: addr,
|
||||
Len: int(size),
|
||||
Cap: int(size),
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// _counters and _ecounters mark the start and end, respectively, of where
|
||||
// the 8-bit coverage counters reside in memory. They're known to cmd/link,
|
||||
// which specially assigns their addresses for this purpose.
|
||||
var _counters, _ecounters [0]byte
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue