Skip to content

Commit 13893a6

Browse files
authored
Value shrinking (#147)
perform shrinking of values within the optimized, shrunken call sequence
1 parent fa4bd62 commit 13893a6

12 files changed

+474
-176
lines changed

fuzzing/fuzzer.go

+20-7
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,8 @@ func NewFuzzer(config config.ProjectConfig) (*Fuzzer, error) {
107107
testCases: make([]TestCase, 0),
108108
testCasesFinished: make(map[string]TestCase),
109109
Hooks: FuzzerHooks{
110-
NewCallSequenceGeneratorConfigFunc: defaultNewCallSequenceGeneratorConfigFunc,
110+
NewCallSequenceGeneratorConfigFunc: defaultCallSequenceGeneratorConfigFunc,
111+
NewShrinkingValueMutatorFunc: defaultShrinkingValueMutatorFunc,
111112
ChainSetupFunc: chainSetupFromCompilations,
112113
CallSequenceTestFuncs: make([]CallSequenceTestFunc, 0),
113114
},
@@ -376,11 +377,11 @@ func chainSetupFromCompilations(fuzzer *Fuzzer, testChain *chain.TestChain) erro
376377
return nil
377378
}
378379

379-
// defaultNewCallSequenceGeneratorConfigFunc is a NewCallSequenceGeneratorConfigFunc which creates a
380+
// defaultCallSequenceGeneratorConfigFunc is a NewCallSequenceGeneratorConfigFunc which creates a
380381
// CallSequenceGeneratorConfig with a default configuration. Returns the config or an error, if one occurs.
381-
func defaultNewCallSequenceGeneratorConfigFunc(fuzzer *Fuzzer, valueSet *valuegeneration.ValueSet, randomProvider *rand.Rand) (*CallSequenceGeneratorConfig, error) {
382-
// Create the underlying value generator for the worker and its sequence generator.
383-
valueGenConfig := &valuegeneration.MutatingValueGeneratorConfig{
382+
func defaultCallSequenceGeneratorConfigFunc(fuzzer *Fuzzer, valueSet *valuegeneration.ValueSet, randomProvider *rand.Rand) (*CallSequenceGeneratorConfig, error) {
383+
// Create the value generator and mutator for the worker.
384+
mutationalGeneratorConfig := &valuegeneration.MutationalValueGeneratorConfig{
384385
MinMutationRounds: 0,
385386
MaxMutationRounds: 1,
386387
GenerateRandomAddressBias: 0.5,
@@ -406,7 +407,7 @@ func defaultNewCallSequenceGeneratorConfigFunc(fuzzer *Fuzzer, valueSet *valuege
406407
GenerateRandomStringMaxSize: 100,
407408
},
408409
}
409-
valueGenerator := valuegeneration.NewMutatingValueGenerator(valueGenConfig, valueSet, randomProvider)
410+
mutationalGenerator := valuegeneration.NewMutationalValueGenerator(mutationalGeneratorConfig, valueSet, randomProvider)
410411

411412
// Create a sequence generator config which uses the created value generator.
412413
sequenceGenConfig := &CallSequenceGeneratorConfig{
@@ -419,11 +420,23 @@ func defaultNewCallSequenceGeneratorConfigFunc(fuzzer *Fuzzer, valueSet *valuege
419420
RandomMutatedCorpusTailWeight: 10,
420421
RandomMutatedSpliceAtRandomWeight: 20,
421422
RandomMutatedInterleaveAtRandomWeight: 10,
422-
ValueGenerator: valueGenerator,
423+
ValueGenerator: mutationalGenerator,
424+
ValueMutator: mutationalGenerator,
423425
}
424426
return sequenceGenConfig, nil
425427
}
426428

429+
// defaultShrinkingValueMutatorFunc is a NewShrinkingValueMutatorFunc which creates value mutator to be used for
430+
// shrinking purposes. Returns the value mutator or an error, if one occurs.
431+
func defaultShrinkingValueMutatorFunc(fuzzer *Fuzzer, valueSet *valuegeneration.ValueSet, randomProvider *rand.Rand) (valuegeneration.ValueMutator, error) {
432+
// Create the shrinking value mutator for the worker.
433+
shrinkingValueMutatorConfig := &valuegeneration.ShrinkingValueMutatorConfig{
434+
ShrinkValueProbability: 0.1,
435+
}
436+
shrinkingValueMutator := valuegeneration.NewShrinkingValueMutator(shrinkingValueMutatorConfig, valueSet, randomProvider)
437+
return shrinkingValueMutator, nil
438+
}
439+
427440
// spawnWorkersLoop is a method which spawns a config-defined amount of FuzzerWorker to carry out the fuzzing campaign.
428441
// This function exits when Fuzzer.ctx is cancelled.
429442
func (f *Fuzzer) spawnWorkersLoop(baseTestChain *chain.TestChain) error {

fuzzing/fuzzer_hooks.go

+15-3
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,27 @@
11
package fuzzing
22

33
import (
4+
"math/rand"
5+
46
"github.com/crytic/medusa/chain"
57
"github.com/crytic/medusa/fuzzing/calls"
68
"github.com/crytic/medusa/fuzzing/valuegeneration"
7-
"math/rand"
89
)
910

1011
// FuzzerHooks defines the hooks that can be used for the Fuzzer on an API level.
1112
type FuzzerHooks struct {
1213
// NewCallSequenceGeneratorConfigFunc describes the function to use to set up a new CallSequenceGeneratorConfig,
1314
// defining parameters for a new FuzzerWorker's CallSequenceGenerator.
14-
// Note: The value generator provided within the config must be either thread safe, or a new instance must be
15-
// provided per call to avoid concurrent access issues between workers.
15+
// The value generator provided must be either thread safe, or a new instance must be provided per invocation to
16+
// avoid concurrent access issues between workers.
1617
NewCallSequenceGeneratorConfigFunc NewCallSequenceGeneratorConfigFunc
1718

19+
// NewShrinkingValueMutatorFunc describes the function used to set up a value mutator used to shrink call
20+
// values in the fuzzer's call sequence shrinking process.
21+
// The value mutator provided must be either thread safe, or a new instance must be provided per invocation to
22+
// avoid concurrent access issues between workers.
23+
NewShrinkingValueMutatorFunc NewShrinkingValueMutatorFunc
24+
1825
// ChainSetupFunc describes the function to use to set up a new test chain's initial state prior to fuzzing.
1926
ChainSetupFunc TestChainSetupFunc
2027

@@ -23,6 +30,11 @@ type FuzzerHooks struct {
2330
CallSequenceTestFuncs []CallSequenceTestFunc
2431
}
2532

33+
// NewShrinkingValueMutatorFunc describes the function used to set up a value mutator used to shrink call
34+
// values in the fuzzer's call sequence shrinking process.
35+
// Returns a new value mutator, or an error if one occurred.
36+
type NewShrinkingValueMutatorFunc func(fuzzer *Fuzzer, valueSet *valuegeneration.ValueSet, randomProvider *rand.Rand) (valuegeneration.ValueMutator, error)
37+
2638
// NewCallSequenceGeneratorConfigFunc defines a method is called to create a new CallSequenceGeneratorConfig, defining
2739
// the parameters for the new FuzzerWorker to use when creating its CallSequenceGenerator used to power fuzzing.
2840
// Returns a new CallSequenceGeneratorConfig, or an error if one is encountered.

0 commit comments

Comments
 (0)