Skip to content

Commit 8ac6695

Browse files
committed
Add new mutation strategy - callSeqGenFuncDuplicateAtRandom
The function duplicates a call sequence element at index N and places it at index N+1 if N is not equal to one less the length of the sequence. Otherwise, the duplicate is placed at index N-1.
1 parent 0e1763f commit 8ac6695

File tree

1 file changed

+24
-2
lines changed

1 file changed

+24
-2
lines changed

Diff for: fuzzing/fuzzer_worker_sequence_generator.go

+24-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@ package fuzzing
22

33
import (
44
"fmt"
5-
"math/big"
6-
75
"github.com/crytic/medusa/fuzzing/calls"
86
"github.com/crytic/medusa/fuzzing/valuegeneration"
97
"github.com/crytic/medusa/utils"
108
"github.com/crytic/medusa/utils/randomutils"
9+
"math/big"
1110
)
1211

1312
// CallSequenceGenerator generates call sequences iteratively per element, for use in fuzzing campaigns. It is attached
@@ -164,6 +163,13 @@ func NewCallSequenceGenerator(worker *FuzzerWorker, config *CallSequenceGenerato
164163
},
165164
new(big.Int).SetUint64(config.RandomMutatedCorpusTailWeight),
166165
),
166+
randomutils.NewWeightedRandomChoice(
167+
CallSequenceGeneratorMutationStrategy{
168+
CallSequenceGeneratorFunc: callSeqGenFuncDuplicateAtRandom,
169+
PrefetchModifyCallFunc: prefetchModifyCallFuncMutate,
170+
},
171+
new(big.Int).SetUint64(config.RandomMutatedCorpusTailWeight),
172+
),
167173
randomutils.NewWeightedRandomChoice(
168174
CallSequenceGeneratorMutationStrategy{
169175
CallSequenceGeneratorFunc: callSeqGenFuncSpliceAtRandom,
@@ -368,6 +374,22 @@ func callSeqGenFuncCorpusTail(sequenceGenerator *CallSequenceGenerator, sequence
368374
return nil
369375
}
370376

377+
// callSeqGenFuncDuplicateAtRandom is a CallSequenceGeneratorFunc which prepares a CallSequenceGenerator to generate a sequence
378+
// which duplicates a call sequence element at index N and inserts it at N+1
379+
// if random index is len(sequence)-1, it inserts the duplicated call sequence element at N-1
380+
func callSeqGenFuncDuplicateAtRandom(sequenceGenerator *CallSequenceGenerator, sequence calls.CallSequence) error {
381+
randIndex := sequenceGenerator.worker.randomProvider.Intn(len(sequence))
382+
duplicatedElement := sequence[randIndex]
383+
384+
if randIndex == len(sequence)-1 {
385+
sequence[randIndex-1] = duplicatedElement
386+
} else {
387+
sequence[randIndex+1] = duplicatedElement
388+
}
389+
390+
return nil
391+
}
392+
371393
// callSeqGenFuncSpliceAtRandom is a CallSequenceGeneratorFunc which prepares a CallSequenceGenerator to generate a
372394
// sequence which is based off of two corpus call sequence entries, from which a random length head and tail are
373395
// respectively sliced and joined together.

0 commit comments

Comments
 (0)