From aff9e255cd708709adef545d1f932020ee5c0978 Mon Sep 17 00:00:00 2001 From: Veronica Radu Date: Wed, 7 Aug 2019 18:00:46 +0200 Subject: prog: add special mutation for binary flags --- prog/mutation.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) (limited to 'prog/mutation.go') diff --git a/prog/mutation.go b/prog/mutation.go index dbb605041..a3ab17637 100644 --- a/prog/mutation.go +++ b/prog/mutation.go @@ -234,7 +234,31 @@ func (t *IntType) mutate(r *randGen, s *state, arg Arg, ctx ArgCtx) (calls []*Ca } func (t *FlagsType) mutate(r *randGen, s *state, arg Arg, ctx ArgCtx) (calls []*Call, retry, preserve bool) { - return mutateInt(r, s, arg) + a := arg.(*ConstArg) + + for oldVal := a.Val; oldVal == a.Val; { + // Generate a new value. + if r.nOutOf(1, 5) { + a.Val = r.flags(t.Vals, t.BitMask, 0) + continue + } + + if !t.BitMask || (t.BitMask && r.nOutOf(1, 4)) { + a.Val = r.flags(t.Vals, t.BitMask, a.Val) + continue + } + + for stop := false; !stop; stop = r.oneOf(3) { + idx := r.rand(len(t.Vals)) + if r.bin() { + a.Val |= 1 << t.Vals[idx] + } else { + a.Val &= ^(1 << t.Vals[idx]) + } + } + } + + return } func (t *LenType) mutate(r *randGen, s *state, arg Arg, ctx ArgCtx) (calls []*Call, retry, preserve bool) { -- cgit mrf-deployment