aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/fuzzer/fuzzer.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-05-16 12:56:43 +0200
committerDmitry Vyukov <dvyukov@google.com>2024-05-16 15:38:27 +0000
commit19e202fa8a3722f5c90ed5847edb5aeabdd5f38f (patch)
treea528875b3c3c531b43d5a184f83ec1a04c213914 /pkg/fuzzer/fuzzer.go
parente072baa2563542356ae03ad6f2057ad143979f18 (diff)
pkg/fuzzer: manipulate ipc.ExecOpts
There's no need in duplicating the signal, coverage, hints flags.
Diffstat (limited to 'pkg/fuzzer/fuzzer.go')
-rw-r--r--pkg/fuzzer/fuzzer.go28
1 files changed, 15 insertions, 13 deletions
diff --git a/pkg/fuzzer/fuzzer.go b/pkg/fuzzer/fuzzer.go
index 9d8957922..10056b528 100644
--- a/pkg/fuzzer/fuzzer.go
+++ b/pkg/fuzzer/fuzzer.go
@@ -96,17 +96,7 @@ type execOpt any
type dontTriage struct{}
type progFlags ProgTypes
-func (fuzzer *Fuzzer) validateRequest(req *queue.Request) {
- if req.NeedHints && (req.NeedCover || req.NeedSignal != queue.NoSignal) {
- panic("Request.NeedHints is mutually exclusive with other fields")
- }
- if req.SignalFilter != nil && req.NeedSignal != queue.NewSignal {
- panic("SignalFilter must be used with NewSignal")
- }
-}
-
func (fuzzer *Fuzzer) execute(executor queue.Executor, req *queue.Request, opts ...execOpt) *queue.Result {
- fuzzer.validateRequest(req)
executor.Submit(req)
res := req.Wait(fuzzer.ctx)
fuzzer.processResult(req, res, opts...)
@@ -114,7 +104,6 @@ func (fuzzer *Fuzzer) execute(executor queue.Executor, req *queue.Request, opts
}
func (fuzzer *Fuzzer) prepare(req *queue.Request, opts ...execOpt) {
- fuzzer.validateRequest(req)
req.OnDone(func(req *queue.Request, res *queue.Result) bool {
fuzzer.processResult(req, res, opts...)
return true
@@ -141,7 +130,7 @@ func (fuzzer *Fuzzer) processResult(req *queue.Request, res *queue.Result, opts
// We do it before unblocking the waiting threads because
// it may result it concurrent modification of req.Prog.
// If we are already triaging this exact prog, this is flaky coverage.
- if req.NeedSignal != queue.NoSignal && res.Info != nil && !noTriage {
+ if req.ExecOpts.ExecFlags&ipc.FlagCollectSignal > 0 && res.Info != nil && !noTriage {
for call, info := range res.Info.Calls {
fuzzer.triageProgCall(req.Prog, &info, call, flags)
}
@@ -155,6 +144,7 @@ func (fuzzer *Fuzzer) processResult(req *queue.Request, res *queue.Result, opts
type Config struct {
Debug bool
Corpus *corpus.Corpus
+ BaseOpts ipc.ExecOpts // Fuzzer will use BaseOpts as a base for all requests.
Logf func(level int, msg string, args ...interface{})
Coverage bool
FaultInjection bool
@@ -236,7 +226,13 @@ func (fuzzer *Fuzzer) startJob(stat *stats.Val, newJob job) {
}
func (fuzzer *Fuzzer) Next() *queue.Request {
- return fuzzer.source.Next()
+ req := fuzzer.source.Next()
+ if req == nil {
+ // The fuzzer is not supposed to issue nil requests.
+ panic("nil request from the fuzzer")
+ }
+ req.ExecOpts = fuzzer.Config.BaseOpts.MergeFlags(req.ExecOpts)
+ return req
}
func (fuzzer *Fuzzer) Logf(level int, msg string, args ...interface{}) {
@@ -337,3 +333,9 @@ func (fuzzer *Fuzzer) RotateMaxSignal(items int) {
delta := pureMaxSignal.RandomSubset(fuzzer.rand(), items)
fuzzer.Cover.subtract(delta)
}
+
+func setFlags(execFlags ipc.ExecFlags) ipc.ExecOpts {
+ return ipc.ExecOpts{
+ ExecFlags: execFlags,
+ }
+}