aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/corpus
diff options
context:
space:
mode:
authorGrigory Bazilevich <g.bazilevich@ispras.ru>2026-03-11 09:44:38 +0300
committerGrigory Bazilevich <g.bazilevich@ispras.ru>2026-03-11 09:44:38 +0300
commit3fe1aeddbc74e43e8561db61cdaad620c5993d92 (patch)
tree5110374b616f67a69c5e6161ff56afabec35ce7d /pkg/corpus
parenta68fda52c366653ed73c240a6b9c3f4e750ccdfd (diff)
pkg/corpus: upgrade corpus minimization algorithm
Diffstat (limited to 'pkg/corpus')
-rw-r--r--pkg/corpus/fenwik.go5
-rw-r--r--pkg/corpus/minimize.go21
2 files changed, 25 insertions, 1 deletions
diff --git a/pkg/corpus/fenwik.go b/pkg/corpus/fenwik.go
index 3a49219ac..dd6bfdbef 100644
--- a/pkg/corpus/fenwik.go
+++ b/pkg/corpus/fenwik.go
@@ -43,6 +43,11 @@ func (t *fenwikTree) prefixSumTo(ind int) (sum int64) {
return
}
+func (t *fenwikTree) reserve(cap int) {
+ t.capacity = cap
+ t.extendAndRebuild()
+}
+
func (t *fenwikTree) extendAndRebuild() {
if t.capacity == 0 {
t.capacity = 16
diff --git a/pkg/corpus/minimize.go b/pkg/corpus/minimize.go
index d01e06f57..d3d68ee27 100644
--- a/pkg/corpus/minimize.go
+++ b/pkg/corpus/minimize.go
@@ -41,11 +41,30 @@ func (corpus *Corpus) Minimize(cover bool) {
// Overwrite the program lists.
corpus.ProgramsList = &ProgramsList{}
+ corpus.ProgramsList.prios.reserve(len(inputs))
for _, area := range corpus.focusAreas {
area.ProgramsList = &ProgramsList{}
}
- for _, ctx := range signal.Minimize(inputs) {
+ progs := signal.Minimize(inputs)
+
+ sort.SliceStable(progs, func(i, j int) bool {
+ first := progs[i].(*Item)
+ second := progs[j].(*Item)
+ return first.ExecLast > second.ExecLast
+ })
+
+ inputs = make([]signal.Context, 0, len(progs))
+ for _, inp := range progs {
+ inputs = append(inputs, signal.Context{
+ Signal: inp.(*Item).StableSignal,
+ Context: inp,
+ })
+ }
+ progs = signal.Minimize(inputs)
+
+ for _, ctx := range progs {
inp := ctx.(*Item)
+
corpus.progsMap[inp.Sig] = inp
corpus.saveProgram(inp.Prog, inp.Signal)
for area := range inp.areas {