aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/fuzzer/cover.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-03-13 18:52:18 +0100
committerAleksandr Nogikh <nogikh@google.com>2024-03-18 10:58:52 +0000
commitfc090d205d8c3d58f190659a98795d89421b7e6b (patch)
tree2b33cca3e6366a1565d70fdce01a51d6e50f6448 /pkg/fuzzer/cover.go
parentd615901c739a765329b688494cee2f8e1b5037cb (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.go56
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),
+ }
+}