@@ -2,12 +2,11 @@ package fuzzing
2
2
3
3
import (
4
4
"fmt"
5
- "math/big"
6
-
7
5
"github.com/crytic/medusa/fuzzing/calls"
8
6
"github.com/crytic/medusa/fuzzing/valuegeneration"
9
7
"github.com/crytic/medusa/utils"
10
8
"github.com/crytic/medusa/utils/randomutils"
9
+ "math/big"
11
10
)
12
11
13
12
// 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
164
163
},
165
164
new (big.Int ).SetUint64 (config .RandomMutatedCorpusTailWeight ),
166
165
),
166
+ randomutils .NewWeightedRandomChoice (
167
+ CallSequenceGeneratorMutationStrategy {
168
+ CallSequenceGeneratorFunc : callSeqGenFuncDuplicateAtRandom ,
169
+ PrefetchModifyCallFunc : prefetchModifyCallFuncMutate ,
170
+ },
171
+ new (big.Int ).SetUint64 (config .RandomMutatedCorpusTailWeight ),
172
+ ),
167
173
randomutils .NewWeightedRandomChoice (
168
174
CallSequenceGeneratorMutationStrategy {
169
175
CallSequenceGeneratorFunc : callSeqGenFuncSpliceAtRandom ,
@@ -368,6 +374,22 @@ func callSeqGenFuncCorpusTail(sequenceGenerator *CallSequenceGenerator, sequence
368
374
return nil
369
375
}
370
376
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
+
371
393
// callSeqGenFuncSpliceAtRandom is a CallSequenceGeneratorFunc which prepares a CallSequenceGenerator to generate a
372
394
// sequence which is based off of two corpus call sequence entries, from which a random length head and tail are
373
395
// respectively sliced and joined together.
0 commit comments