diff options
| author | Alexander Potapenko <glider@google.com> | 2017-08-08 16:50:22 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2017-08-08 17:57:01 +0200 |
| commit | d8b0de2df3c9646b9b4d160f1ea6b678381d23be (patch) | |
| tree | f5ede9e82dc4a5be59ccf657aadd424e3d576c07 | |
| parent | 1db36864e92915f8d737cee93ab787cf43681d6a (diff) | |
prog: reduce the "uber-mmap" size
During minimization we create a single memory mapping that contains all
the smaller mmap() ranges, so that other mmap() calls can be dropped.
This "uber-mmap" used to start at 0x7f0000000000 regardless of where the
smaller mappings were located. Change its starting address to the
beginning of the first small mmap() range.
| -rw-r--r-- | prog/mutation.go | 6 | ||||
| -rw-r--r-- | prog/mutation_test.go | 8 |
2 files changed, 9 insertions, 5 deletions
diff --git a/prog/mutation.go b/prog/mutation.go index 98e7e567d..853e7141d 100644 --- a/prog/mutation.go +++ b/prog/mutation.go @@ -270,9 +270,13 @@ func Minimize(p0 *Prog, callIndex0 int, pred func(*Prog, int) bool, crash bool) // Try to glue all mmap's together. s := analyze(nil, p0, nil) hi := -1 + lo := -1 for i := 0; i < maxPages; i++ { if s.pages[i] { hi = i + if lo == -1 { + lo = i + } } } if hi != -1 { @@ -290,7 +294,7 @@ func Minimize(p0 *Prog, callIndex0 int, pred func(*Prog, int) bool, crash bool) } } // Prepend uber-mmap. - mmap := createMmapCall(0, uintptr(hi)+1) + mmap := createMmapCall(uintptr(lo), uintptr(hi-lo)+1) p.Calls = append([]*Call{mmap}, p.Calls...) if callIndex != -1 { callIndex++ diff --git a/prog/mutation_test.go b/prog/mutation_test.go index 44a6eabc3..2f70e0a5d 100644 --- a/prog/mutation_test.go +++ b/prog/mutation_test.go @@ -255,15 +255,15 @@ func TestMinimize(t *testing.T) { // Glue several mmaps together. { "sched_yield()\n" + - "mmap(&(0x7f0000000000/0x1000)=nil, 0x1000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n" + - "mmap(&(0x7f0000001000/0x1000)=nil, 0x1000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n" + + "mmap(&(0x7f0000010000/0x1000)=nil, 0x1000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n" + + "mmap(&(0x7f0000011000/0x1000)=nil, 0x1000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n" + "getpid()\n" + - "mmap(&(0x7f0000005000/0x5000)=nil, 0x2000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n", + "mmap(&(0x7f0000015000/0x5000)=nil, 0x2000, 0x3, 0x32, 0xffffffffffffffff, 0x0)\n", 3, func(p *Prog, callIndex int) bool { return p.String() == "mmap-sched_yield-getpid" }, - "mmap(&(0x7f0000000000/0x7000)=nil, 0x7000, 0x0, 0x0, 0xffffffffffffffff, 0x0)\n" + + "mmap(&(0x7f0000010000/0x7000)=nil, 0x7000, 0x0, 0x0, 0xffffffffffffffff, 0x0)\n" + "sched_yield()\n" + "getpid()\n", 2, |
