aboutsummaryrefslogtreecommitdiffstats
path: root/prog
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2017-11-29 09:47:55 +0100
committerDmitry Vyukov <dvyukov@google.com>2017-11-29 11:12:47 +0100
commit3a80fe350da4f5fc054c06fe279cc7ea734eb28b (patch)
tree4022743a66524b3534fc30eb7ef73e2af36761e5 /prog
parent1a6a7478c298a362d63a2f412155c70b7f97671d (diff)
prog: support bytesizeN for vma
I guess this is currently unused, but ignoring bytesizeN for vma looks wrong. If user asks for bytesizeN for vma, divide vma size by N.
Diffstat (limited to 'prog')
-rw-r--r--prog/mutation_test.go13
-rw-r--r--prog/size.go22
-rw-r--r--prog/size_test.go6
3 files changed, 23 insertions, 18 deletions
diff --git a/prog/mutation_test.go b/prog/mutation_test.go
index 1fe2da9eb..418ca3659 100644
--- a/prog/mutation_test.go
+++ b/prog/mutation_test.go
@@ -23,7 +23,7 @@ func TestClone(t *testing.T) {
}
}
-func TestMutate(t *testing.T) {
+func TestMutateRandom(t *testing.T) {
target, rs, iters := initTest(t)
next:
for i := 0; i < iters; i++ {
@@ -36,12 +36,17 @@ next:
p1.Mutate(rs, 10, nil, nil)
data := p.Serialize()
if !bytes.Equal(data0, data) {
- t.Fatalf("program changed after clone/mutate\noriginal:\n%s\n\nnew:\n%s\n", data0, data)
+ t.Fatalf("program changed after clone/mutate\noriginal:\n%s\n\nnew:\n%s\n",
+ data0, data)
}
data1 := p1.Serialize()
- if !bytes.Equal(data, data1) {
- continue next
+ if bytes.Equal(data, data1) {
+ continue
}
+ if _, err := target.Deserialize(data1); err != nil {
+ t.Fatalf("Deserialize failed after Mutate: %v\n%s", err, data1)
+ }
+ continue next
}
t.Fatalf("mutation does not change program:\n%s", data0)
}
diff --git a/prog/size.go b/prog/size.go
index 538b60c5d..718e0c426 100644
--- a/prog/size.go
+++ b/prog/size.go
@@ -7,29 +7,29 @@ import (
"fmt"
)
-func (target *Target) generateSize(arg Arg, lenType *LenType) Arg {
+func (target *Target) generateSize(arg Arg, lenType *LenType) uint64 {
if arg == nil {
// Arg is an optional pointer, set size to 0.
- return MakeConstArg(lenType, 0)
+ return 0
}
+ byteSize := lenType.ByteSize
+ if byteSize == 0 {
+ byteSize = 1
+ }
switch arg.Type().(type) {
case *VmaType:
a := arg.(*PointerArg)
- return MakeConstArg(lenType, a.PagesNum*target.PageSize)
+ return a.PagesNum * target.PageSize / byteSize
case *ArrayType:
a := arg.(*GroupArg)
if lenType.ByteSize != 0 {
- return MakeConstArg(lenType, a.Size()/lenType.ByteSize)
+ return a.Size() / byteSize
} else {
- return MakeConstArg(lenType, uint64(len(a.Inner)))
+ return uint64(len(a.Inner))
}
default:
- if lenType.ByteSize != 0 {
- return MakeConstArg(lenType, arg.Size()/lenType.ByteSize)
- } else {
- return MakeConstArg(lenType, arg.Size())
- }
+ return arg.Size() / byteSize
}
}
@@ -53,7 +53,7 @@ func (target *Target) assignSizes(args []Arg, parentsMap map[Arg]Arg) {
buf, ok := argsMap[typ.Buf]
if ok {
- *a = *target.generateSize(InnerArg(buf), typ).(*ConstArg)
+ a.Val = target.generateSize(InnerArg(buf), typ)
continue
}
diff --git a/prog/size_test.go b/prog/size_test.go
index f52a6ecce..24bc6f3ec 100644
--- a/prog/size_test.go
+++ b/prog/size_test.go
@@ -26,7 +26,7 @@ func TestAssignSizeRandom(t *testing.T) {
target.assignSizesCall(call)
}
if data1 := p.Serialize(); !bytes.Equal(data0, data1) {
- t.Fatalf("different lens assigned, initial: %v, new: %v", data0, data1)
+ t.Fatalf("different lens assigned, initial:\n%s\nnew:\n%s", data0, data1)
}
}
}
@@ -78,8 +78,8 @@ func TestAssignSize(t *testing.T) {
"syz_test$length9(&(0x7f000001f000)={&(0x7f0000000000/0x5000)=nil, 0x5000})",
},
{
- "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x0000)",
- "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x5000)",
+ "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x0000, 0x0000, 0x0000, 0x0000)",
+ "syz_test$length10(&(0x7f0000000000/0x5000)=nil, 0x5000, 0x5000, 0x2800, 0x1400)",
},
{
"syz_test$length11(&(0x7f0000000000)={0xff, 0xff, [0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff]}, 0x00)",