From f41935d53ff6271e8c2a9022f41b99ccee9b634b Mon Sep 17 00:00:00 2001 From: Andrey Konovalov Date: Thu, 15 Sep 2016 13:45:06 +0200 Subject: Allow range sized arrays --- prog/mutation.go | 18 ++++++++++++++---- prog/rand.go | 11 +++++++++-- 2 files changed, 23 insertions(+), 6 deletions(-) (limited to 'prog') diff --git a/prog/mutation.go b/prog/mutation.go index a00f64e43..a428d27cd 100644 --- a/prog/mutation.go +++ b/prog/mutation.go @@ -102,9 +102,19 @@ func (p *Prog) Mutate(rs rand.Source, ncalls int, ct *ChoiceTable) { filename := r.filename(s) arg.Data = []byte(filename) case sys.ArrayType: - count := r.rand(6) - if count == uintptr(len(arg.Inner)) { - count++ + count := uintptr(0) + switch a.Kind { + case sys.ArrayRandLen: + for count == uintptr(len(arg.Inner)) { + count = r.rand(6) + } + case sys.ArrayRangeLen: + if a.RangeBegin == a.RangeEnd { + panic("trying to mutate fixed length array") + } + for count == uintptr(len(arg.Inner)) { + count = r.randRange(int(a.RangeBegin), int(a.RangeEnd)) + } } if count > uintptr(len(arg.Inner)) { var calls []*Call @@ -344,7 +354,7 @@ func mutationArgs(c *Call) (args, bases []*Arg, parents []*[]*Arg) { // These special structs are mutated as a whole. case sys.ArrayType: // Don't mutate fixed-size arrays. - if typ.Len != 0 { + if typ.Kind == sys.ArrayRangeLen && typ.RangeBegin == typ.RangeEnd { return } case sys.LenType: diff --git a/prog/rand.go b/prog/rand.go index b359748ea..859113474 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -26,6 +26,10 @@ func (r *randGen) rand(n int) uintptr { return uintptr(r.Intn(n)) } +func (r *randGen) randRange(begin int, end int) uintptr { + return uintptr(begin + r.Intn(end-begin+1)) +} + func (r *randGen) bin() bool { return r.Intn(2) == 0 } @@ -770,9 +774,12 @@ func (r *randGen) generateArg(s *state, typ sys.Type, dir ArgDir, sizes map[stri filename := r.filename(s) return dataArg([]byte(filename)), nil, nil case sys.ArrayType: - count := a.Len - if count == 0 { + count := uintptr(0) + switch a.Kind { + case sys.ArrayRandLen: count = r.rand(6) + case sys.ArrayRangeLen: + count = r.randRange(int(a.RangeBegin), int(a.RangeEnd)) } sz := constArg(count) var inner []*Arg -- cgit mrf-deployment