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  }