From f85e28d8a74848f34bdfb105079245c3d38ff9ae Mon Sep 17 00:00:00 2001 From: Aleksandr Nogikh Date: Wed, 20 Mar 2024 21:00:39 +0100 Subject: 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. --- pkg/fuzzer/cover.go | 32 ++++++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 6 deletions(-) (limited to 'pkg/fuzzer/cover.go') 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) +} -- cgit mrf-deployment