aboutsummaryrefslogtreecommitdiffstats
path: root/prog
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2016-09-19 19:42:00 +0200
committerGitHub <noreply@github.com>2016-09-19 19:42:00 +0200
commitd18f8aa3669db8a7c2a9d235aa720bce8041f329 (patch)
tree56195536ec22d1414e7614403dc2757d9d76d4ca /prog
parent0c97d70213a4fbc6d8d57626c18b603f2a281047 (diff)
parentf41935d53ff6271e8c2a9022f41b99ccee9b634b (diff)
Merge pull request #73 from xairy/ranged_arrays
Allow range sized arrays
Diffstat (limited to 'prog')
-rw-r--r--prog/mutation.go18
-rw-r--r--prog/rand.go11
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