diff options
| author | Aleksandr Nogikh <nogikh@google.com> | 2024-03-13 18:52:18 +0100 |
|---|---|---|
| committer | Aleksandr Nogikh <nogikh@google.com> | 2024-03-18 10:58:52 +0000 |
| commit | fc090d205d8c3d58f190659a98795d89421b7e6b (patch) | |
| tree | 2b33cca3e6366a1565d70fdce01a51d6e50f6448 /pkg/fuzzer/cover.go | |
| parent | d615901c739a765329b688494cee2f8e1b5037cb (diff) | |
pkg/corpus: a separate package for the corpus functionality
pkg/fuzzer and syz-manager have a common corpus functionality that can
be well be unified.
Create a separate pkg/corpus package that would be used by both of them.
It will simplify further work of moving pkg/fuzzer to the host.
Diffstat (limited to 'pkg/fuzzer/cover.go')
| -rw-r--r-- | pkg/fuzzer/cover.go | 56 |
1 files changed, 56 insertions, 0 deletions
diff --git a/pkg/fuzzer/cover.go b/pkg/fuzzer/cover.go new file mode 100644 index 000000000..cc18862bd --- /dev/null +++ b/pkg/fuzzer/cover.go @@ -0,0 +1,56 @@ +// Copyright 2024 syzkaller project authors. All rights reserved. +// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. + +package fuzzer + +import ( + "sync" + + "github.com/google/syzkaller/pkg/signal" +) + +// 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 +} + +// Signal that should no longer be chased after. +func (cover *Cover) AddMaxSignal(sign signal.Signal) { + cover.mu.Lock() + defer cover.mu.Unlock() + cover.maxSignal.Merge(sign) +} + +func (cover *Cover) addRawMaxSignal(signal []uint32, prio uint8) signal.Signal { + cover.mu.Lock() + defer cover.mu.Unlock() + diff := cover.maxSignal.DiffRaw(signal, prio) + if diff.Empty() { + return diff + } + cover.maxSignal.Merge(diff) + cover.newSignal.Merge(diff) + return diff +} + +func (cover *Cover) GrabNewSignal() signal.Signal { + cover.mu.Lock() + defer cover.mu.Unlock() + sign := cover.newSignal + cover.newSignal = nil + return sign +} + +type CoverStat struct { + MaxSignal int +} + +func (cover *Cover) Stat() CoverStat { + cover.mu.RLock() + defer cover.mu.RUnlock() + return CoverStat{ + MaxSignal: len(cover.maxSignal), + } +} |
