diff options
| author | Veronica Radu <veronicaradu@google.com> | 2019-08-07 18:00:46 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2019-08-09 15:02:02 +0200 |
| commit | aff9e255cd708709adef545d1f932020ee5c0978 (patch) | |
| tree | 353468cb149a587e747cfc702003946abd5130a2 /prog/rand.go | |
| parent | e5701ed16c822ef5a4abc4224b44c36b3489aca3 (diff) | |
prog: add special mutation for binary flags
Diffstat (limited to 'prog/rand.go')
| -rw-r--r-- | prog/rand.go | 16 |
1 files changed, 9 insertions, 7 deletions
diff --git a/prog/rand.go b/prog/rand.go index e4164b74a..be57c3e64 100644 --- a/prog/rand.go +++ b/prog/rand.go @@ -137,15 +137,17 @@ func (r *randGen) randPageCount() (n uint64) { return } -func (r *randGen) flags(vv []uint64) (v uint64) { +// Change a flag value or generate a new one. +func (r *randGen) flags(vv []uint64, bitmask bool, oldVal uint64) (v uint64) { + v = oldVal switch { - case r.nOutOf(90, 111): + case (bitmask && r.nOutOf(7, 10)) || (!bitmask && r.nOutOf(1, 5)): for stop := false; !stop; stop = r.bin() { - v |= vv[r.rand(len(vv))] + v |= vv[r.rand(len(vv))] // prioritized when bitmask = true } - case r.nOutOf(10, 21): - v = vv[r.rand(len(vv))] - case r.nOutOf(10, 11): + case (bitmask && r.nOutOf(2, 3)) || (!bitmask && r.nOutOf(7, 8)): + v = vv[r.rand(len(vv))] // prioritized when bitmask = false + case r.bin(): v = 0 default: v = r.rand64() @@ -675,7 +677,7 @@ func (a *VmaType) generate(r *randGen, s *state) (arg Arg, calls []*Call) { } func (a *FlagsType) generate(r *randGen, s *state) (arg Arg, calls []*Call) { - return MakeConstArg(a, r.flags(a.Vals)), nil + return MakeConstArg(a, r.flags(a.Vals, a.BitMask, 0)), nil } func (a *ConstType) generate(r *randGen, s *state) (arg Arg, calls []*Call) { |
