aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/corpus/minimize.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2024-10-24 10:15:09 +0200
committerTaras Madan <tarasmadan@google.com>2024-10-25 12:08:02 +0000
commit479141f703a43adab07cba7f8b3c99399fbbeb68 (patch)
tree7e3334fbfb856e4bc29bf5e8d016a4fefe4b842a /pkg/corpus/minimize.go
parent945e91b794873481a34fe25de502ba96c8dc2a6b (diff)
pkg/corpus: support multiple focus areas
Focus area assigns a fuzzing priority to a set of PCs. When running ChooseProgram(), corpus will first select a focus area proportionally to the specified weights, and only then continue with selecting a program belonging to it.
Diffstat (limited to 'pkg/corpus/minimize.go')
-rw-r--r--pkg/corpus/minimize.go19
1 files changed, 13 insertions, 6 deletions
diff --git a/pkg/corpus/minimize.go b/pkg/corpus/minimize.go
index 8eac96122..d01e06f57 100644
--- a/pkg/corpus/minimize.go
+++ b/pkg/corpus/minimize.go
@@ -14,7 +14,7 @@ func (corpus *Corpus) Minimize(cover bool) {
defer corpus.mu.Unlock()
inputs := make([]signal.Context, 0, len(corpus.progs))
- for _, inp := range corpus.progs {
+ for _, inp := range corpus.progsMap {
inputs = append(inputs, signal.Context{
Signal: inp.Signal,
Context: inp,
@@ -37,12 +37,19 @@ func (corpus *Corpus) Minimize(cover bool) {
return len(first.Prog.Calls) < len(second.Prog.Calls)
})
- corpus.progs = make(map[string]*Item)
- programsList := &ProgramsList{}
+ corpus.progsMap = make(map[string]*Item)
+
+ // Overwrite the program lists.
+ corpus.ProgramsList = &ProgramsList{}
+ for _, area := range corpus.focusAreas {
+ area.ProgramsList = &ProgramsList{}
+ }
for _, ctx := range signal.Minimize(inputs) {
inp := ctx.(*Item)
- corpus.progs[inp.Sig] = inp
- programsList.saveProgram(inp.Prog, inp.Signal)
+ corpus.progsMap[inp.Sig] = inp
+ corpus.saveProgram(inp.Prog, inp.Signal)
+ for area := range inp.areas {
+ area.saveProgram(inp.Prog, inp.Signal)
+ }
}
- corpus.ProgramsList.replace(programsList)
}