github.com/google/syzkaller@v0.0.0-20251211124644-a066d2bc4b02/pkg/fuzzer/cover.go (about) 1 // Copyright 2024 syzkaller project authors. All rights reserved. 2 // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. 3 4 package fuzzer 5 6 import ( 7 "sync" 8 9 "github.com/google/syzkaller/pkg/signal" 10 "github.com/google/syzkaller/pkg/stat" 11 ) 12 13 // Cover keeps track of the signal known to the fuzzer. 14 type Cover struct { 15 mu sync.RWMutex 16 maxSignal signal.Signal // max signal ever observed (including flakes) 17 newSignal signal.Signal // newly identified max signal 18 } 19 20 func newCover() *Cover { 21 cover := new(Cover) 22 stat.New("max signal", "Maximum fuzzing signal (including flakes)", 23 stat.Graph("signal"), stat.LenOf(&cover.maxSignal, &cover.mu)) 24 return cover 25 } 26 27 func (cover *Cover) addRawMaxSignal(signal []uint64, prio uint8) signal.Signal { 28 cover.mu.Lock() 29 defer cover.mu.Unlock() 30 diff := cover.maxSignal.DiffRaw(signal, prio) 31 if diff.Empty() { 32 return diff 33 } 34 cover.maxSignal.Merge(diff) 35 cover.newSignal.Merge(diff) 36 return diff 37 } 38 39 func (cover *Cover) CopyMaxSignal() signal.Signal { 40 cover.mu.RLock() 41 defer cover.mu.RUnlock() 42 return cover.maxSignal.Copy() 43 } 44 45 func (cover *Cover) GrabSignalDelta() signal.Signal { 46 cover.mu.Lock() 47 defer cover.mu.Unlock() 48 plus := cover.newSignal 49 cover.newSignal = nil 50 return plus 51 }