diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2016-09-19 19:42:00 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2016-09-19 19:42:00 +0200 |
| commit | d18f8aa3669db8a7c2a9d235aa720bce8041f329 (patch) | |
| tree | 56195536ec22d1414e7614403dc2757d9d76d4ca /prog | |
| parent | 0c97d70213a4fbc6d8d57626c18b603f2a281047 (diff) | |
| parent | f41935d53ff6271e8c2a9022f41b99ccee9b634b (diff) | |
Merge pull request #73 from xairy/ranged_arrays
Allow range sized arrays
Diffstat (limited to 'prog')
| -rw-r--r-- | prog/mutation.go | 18 | ||||
| -rw-r--r-- | prog/rand.go | 11 |
2 files changed, 23 insertions, 6 deletions
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 97033b434..26063b626 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 |
