From 7db2edcb3364ef5415e992a18c02c73bba6cdd29 Mon Sep 17 00:00:00 2001 From: Baozeng Ding Date: Mon, 8 Aug 2016 21:32:48 +0800 Subject: sys/sysgen/prog: support ranged int This commit supports inclusive ranged int, like foo int32[-10~10], which will generate random integer between -10 and 10. In future we will support more than one range, like int32[0, -5~10, 50, 100~200] --- sysgen/sysgen.go | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'sysgen/sysgen.go') diff --git a/sysgen/sysgen.go b/sysgen/sysgen.go index 824c8587d..9628e3cae 100644 --- a/sysgen/sysgen.go +++ b/sysgen/sysgen.go @@ -1,4 +1,4 @@ -// Copyright 2015 syzkaller project authors. All rights reserved. +// Copyright 2015/2016 syzkaller project authors. All rights reserved. // Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. package main @@ -288,10 +288,21 @@ func generateArg(name, typ string, a []string, structs map[string]Struct, unname } fmt.Fprintf(out, "PtrType{%v, Dir: %v, Type: StrConstType{%v, Val: \"%v\"}}", common(), fmtDir("in"), common(), a[0]+"\\x00") case "int8", "int16", "int32", "int64", "intptr": - if want := 0; len(a) != want { - failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) + if len(a) == 1 { + s := a[0] + var lo, hi int64 + if _, err := fmt.Sscanf(s, "%d~%d", &lo, &hi); err != nil { + failf("failed to parse int range: %v (%v)", s, err) + } + if lo >= hi { + failf("bad int range: %v", s) + } + fmt.Fprintf(out, "IntType{%v, TypeSize: %v, Kind: IntRange, RangeBegin: %v, RangeEnd: %v}", common(), typeToSize(typ), lo, hi) + } else if len(a) == 0 { + fmt.Fprintf(out, "IntType{%v, TypeSize: %v}", common(), typeToSize(typ)) + } else { + failf("wrong number of arguments for %v arg %v, want 0 or 1, got %v", typ, name, len(a)) } - fmt.Fprintf(out, "IntType{%v, TypeSize: %v}", common(), typeToSize(typ)) case "signalno": if want := 0; len(a) != want { failf("wrong number of arguments for %v arg %v, want %v, got %v", typ, name, want, len(a)) -- cgit mrf-deployment