diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2017-10-20 11:54:24 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-10-23 09:59:39 +0200 |
| commit | 4f9fc95501bebe08ba8977582c055c9068c2c08f (patch) | |
| tree | 4a2eb9b5697c2369dfedeb8526279c868ba97be9 /prog/hints_test.go | |
| parent | a3789f831f64b39c12338741cd8c5c2b34015e5f (diff) | |
prog: fix bugs in hints generation
Add a random hints test and fix bugs it uncovers.
Diffstat (limited to 'prog/hints_test.go')
| -rw-r--r-- | prog/hints_test.go | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/prog/hints_test.go b/prog/hints_test.go index 3f0a10726..31cc13889 100644 --- a/prog/hints_test.go +++ b/prog/hints_test.go @@ -336,3 +336,55 @@ func TestHintsShrinkExpand(t *testing.T) { }) } } + +func TestHintsRandom(t *testing.T) { + target, rs, iters := initTest(t) + iters /= 10 // the test takes long + r := newRand(target, rs) + for i := 0; i < iters; i++ { + p := target.Generate(rs, 5, nil) + comps := make([]CompMap, len(p.Calls)) + for i, c := range p.Calls { + vals := extractValues(c) + for j := 0; j < 5; j++ { + vals[r.randInt()] = true + } + comps[i] = make(CompMap) + for v := range vals { + comps[i].AddComp(v, r.randInt()) + } + } + p.MutateWithHints(comps, func(p1 *Prog) {}) + } +} + +func extractValues(c *Call) map[uint64]bool { + vals := make(map[uint64]bool) + foreachArg(c, func(arg, _ Arg, _ *[]Arg) { + switch a := arg.(type) { + case *ConstArg: + vals[a.Val] = true + case *DataArg: + for i := range a.Data { + vals[uint64(a.Data[i])] = true + if i < len(a.Data)-1 { + v := uint64(a.Data[i]) | uint64(a.Data[i+1])<<8 + vals[v] = true + } + if i < len(a.Data)-3 { + v := uint64(a.Data[i]) | uint64(a.Data[i+1])<<8 | + uint64(a.Data[i+2])<<16 | uint64(a.Data[i+3])<<24 + vals[v] = true + } + if i < len(a.Data)-7 { + v := uint64(a.Data[i]) | uint64(a.Data[i+1])<<8 | + uint64(a.Data[i+2])<<16 | uint64(a.Data[i+3])<<24 | + uint64(a.Data[i+4])<<32 | uint64(a.Data[i+5])<<40 | + uint64(a.Data[i+6])<<48 | uint64(a.Data[i+7])<<56 + vals[v] = true + } + } + } + }) + return vals +} |
