aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/fuzzer/cover.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-03-20 21:00:39 +0100
committerAleksandr Nogikh <nogikh@google.com>2024-03-25 13:12:00 +0000
commitf85e28d8a74848f34bdfb105079245c3d38ff9ae (patch)
tree4c03dec2a7aaf4238c007ca826b1c4f9b4658c49 /pkg/fuzzer/cover.go
parent409ee912f2c4f07e3064b4e6f4a83e1f812531d8 (diff)
pkg/fuzzer: implement basic max signal rotation
Once in 15 minutes, drop 1000 elements of the pure max signal (that is, max signal minus corpus signal). It seems to have a positive effect on the total fuzzing performance.
Diffstat (limited to 'pkg/fuzzer/cover.go')
-rw-r--r--pkg/fuzzer/cover.go32
1 files changed, 26 insertions, 6 deletions
diff --git a/pkg/fuzzer/cover.go b/pkg/fuzzer/cover.go
index 5af00f167..31d1fee1b 100644
--- a/pkg/fuzzer/cover.go
+++ b/pkg/fuzzer/cover.go
@@ -11,16 +11,19 @@ import (
// Cover keeps track of the signal known to the fuzzer.
type Cover struct {
- mu sync.RWMutex
- maxSignal signal.Signal // max signal ever observed (including flakes)
- newSignal signal.Signal // newly identified max signal
+ mu sync.RWMutex
+ maxSignal signal.Signal // max signal ever observed (including flakes)
+ newSignal signal.Signal // newly identified max signal
+ dropSignal signal.Signal // the newly dropped max signal
}
// Signal that should no longer be chased after.
+// It is not returned in GrabSignalDelta().
func (cover *Cover) AddMaxSignal(sign signal.Signal) {
cover.mu.Lock()
defer cover.mu.Unlock()
cover.maxSignal.Merge(sign)
+ cover.dropSignal.Subtract(sign)
}
func (cover *Cover) addRawMaxSignal(signal []uint32, prio uint8) signal.Signal {
@@ -32,21 +35,30 @@ func (cover *Cover) addRawMaxSignal(signal []uint32, prio uint8) signal.Signal {
}
cover.maxSignal.Merge(diff)
cover.newSignal.Merge(diff)
+ cover.dropSignal.Subtract(diff)
return diff
}
+func (cover *Cover) pureMaxSignal(corpus signal.Signal) signal.Signal {
+ cover.mu.RLock()
+ defer cover.mu.RUnlock()
+ return corpus.Diff(cover.maxSignal)
+}
+
func (cover *Cover) CopyMaxSignal() signal.Signal {
cover.mu.RLock()
defer cover.mu.RUnlock()
return cover.maxSignal.Copy()
}
-func (cover *Cover) GrabNewSignal() signal.Signal {
+func (cover *Cover) GrabSignalDelta() (plus, minus signal.Signal) {
cover.mu.Lock()
defer cover.mu.Unlock()
- sign := cover.newSignal
+ plus = cover.newSignal
cover.newSignal = nil
- return sign
+ minus = cover.dropSignal
+ cover.dropSignal = nil
+ return
}
type CoverStats struct {
@@ -60,3 +72,11 @@ func (cover *Cover) Stats() CoverStats {
MaxSignal: len(cover.maxSignal),
}
}
+
+func (cover *Cover) subtract(delta signal.Signal) {
+ cover.mu.Lock()
+ defer cover.mu.Unlock()
+ cover.maxSignal.Subtract(delta)
+ cover.newSignal.Subtract(delta)
+ cover.dropSignal.Merge(delta)
+}