diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-03-20 21:00:39 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-03-25 13:12:00 +0000 |
| commit | f85e28d8a74848f34bdfb105079245c3d38ff9ae (patch) | |
| tree | 4c03dec2a7aaf4238c007ca826b1c4f9b4658c49 /pkg/fuzzer/cover.go | |
| parent | 409ee912f2c4f07e3064b4e6f4a83e1f812531d8 (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.go | 32 |
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) +} |
