本文整理匯總了Golang中github.com/google/syzkaller/sys.Type.Optional方法的典型用法代碼示例。如果您正苦於以下問題:Golang Type.Optional方法的具體用法?Golang Type.Optional怎麽用?Golang Type.Optional使用的例子?那麽, 這裏精選的方法代碼示例或許可以為您提供幫助。您也可以進一步了解該方法所在類github.com/google/syzkaller/sys.Type
的用法示例。
在下文中一共展示了Type.Optional方法的4個代碼示例,這些例子默認根據受歡迎程度排序。您可以為喜歡或者感覺有用的代碼點讚,您的評價將有助於係統推薦出更棒的Golang代碼示例。
示例1: InnerArg
// Returns inner arg for PtrType args
func (a *Arg) InnerArg(typ sys.Type) *Arg {
switch typ1 := typ.(type) {
case sys.PtrType:
if a.Res == nil {
if typ.Optional() {
return nil
} else {
panic(fmt.Sprintf("non-optional pointer is nil\narg: %+v\ntype: %+v", a, typ1))
}
} else {
return a.Res.InnerArg(typ1.Type)
}
default:
return a
}
}
示例2: generateArg
func (r *randGen) generateArg(s *state, typ sys.Type, dir ArgDir) (arg *Arg, calls []*Call) {
if dir == DirOut {
// No need to generate something interesting for output scalar arguments.
// But we still need to generate the argument itself so that it can be referenced
// in subsequent calls. For the same reason we do generate pointer/array/struct
// output arguments (their elements can be referenced in subsequent calls).
switch typ.(type) {
case sys.IntType, sys.FlagsType, sys.ConstType, sys.StrConstType, sys.FileoffType, sys.ResourceType:
return constArg(0), nil
}
}
if typ.Optional() && r.oneOf(5) {
if _, ok := typ.(sys.BufferType); ok {
panic("impossible") // parent PtrType must be Optional instead
}
return constArg(typ.Default()), nil
}
switch a := typ.(type) {
case sys.ResourceType:
r.choose(
1, func() {
special := a.SpecialValues()
arg = constArg(special[r.Intn(len(special))])
},
90, func() {
// Get an existing resource.
var allres []*Arg
for name1, res1 := range s.resources {
if sys.IsCompatibleResource(a.Desc.Name, name1) ||
r.oneOf(20) && sys.IsCompatibleResource(a.Desc.Kind[0], name1) {
allres = append(allres, res1...)
}
}
if len(allres) != 0 {
arg = resultArg(allres[r.Intn(len(allres))])
} else {
arg, calls = r.createResource(s, a)
}
},
5, func() {
// Create a new resource.
arg, calls = r.createResource(s, a)
},
)
return arg, calls
case sys.FileoffType:
// TODO: can do better
var arg *Arg
r.choose(
90, func() { arg = constArg(0) },
10, func() { arg = constArg(r.rand(100)) },
1, func() { arg = constArg(r.randInt()) },
)
return arg, nil
case sys.BufferType:
switch a.Kind {
case sys.BufferBlobRand, sys.BufferBlobRange:
sz := r.randBufLen()
if a.Kind == sys.BufferBlobRange {
sz = r.randRange(int(a.RangeBegin), int(a.RangeEnd))
}
data := make([]byte, sz)
if dir != DirOut {
for i := range data {
data[i] = byte(r.Intn(256))
}
}
return dataArg(data), nil
case sys.BufferString:
data := r.randString(s)
return dataArg(data), nil
case sys.BufferFilesystem:
data := r.filesystem(s)
return dataArg(data), nil
case sys.BufferSockaddr:
data := r.sockaddr(s)
if dir == DirOut {
for i := range data {
data[i] = 0
}
}
return dataArg(data), nil
case sys.BufferAlgType:
data := r.algType(s)
if dir == DirOut {
for i := range data {
data[i] = 0
}
}
return dataArg(data), nil
case sys.BufferAlgName:
data := r.algName(s)
if dir == DirOut {
for i := range data {
data[i] = 0
}
}
return dataArg(data), nil
//.........這裏部分代碼省略.........
示例3: generateArg
func (r *randGen) generateArg(s *state, typ sys.Type, dir ArgDir, sizes map[string]*Arg) (arg, size *Arg, calls []*Call) {
if dir == DirOut {
// No need to generate something interesting for output scalar arguments.
// But we still need to generate the argument itself so that it can be referenced
// in subsequent calls. For the same reason we do generate pointer/array/struct
// output arguments (their elements can be referenced in subsequent calls).
switch typ.(type) {
case sys.IntType, sys.FlagsType, sys.ConstType, sys.StrConstType, sys.FileoffType, sys.ResourceType:
return constArg(0), nil, nil
}
}
if typ.Optional() && r.oneOf(10) {
if _, ok := typ.(sys.BufferType); ok {
panic("impossible") // parent PtrType must be Optional instead
}
return constArg(typ.Default()), constArg(0), nil
}
switch a := typ.(type) {
case sys.ResourceType:
r.choose(
1, func() {
special := a.SpecialValues()
arg = constArg(special[r.Intn(len(special))])
},
90, func() {
// Get an existing resource.
if ress := s.resources[a.Kind]; ress != nil {
allres := ress[a.Subkind]
allres = append(allres, ress[sys.ResAny]...)
if a.Subkind == sys.ResAny || r.oneOf(10) {
for _, v := range ress {
allres = append(allres, v...)
}
}
if len(allres) != 0 {
// TODO: negative PIDs mean process group,
// we should be able to negate an existing PID.
arg = resultArg(allres[r.Intn(len(allres))])
}
}
if arg == nil {
arg, calls = r.createResource(s, a)
}
},
5, func() {
// Create a new resource.
arg, calls = r.createResource(s, a)
},
)
return arg, nil, calls
case sys.FileoffType:
// TODO: can do better
var arg *Arg
r.choose(
90, func() { arg = constArg(0) },
10, func() { arg = constArg(r.rand(100)) },
1, func() { arg = constArg(r.randInt()) },
)
return arg, nil, nil
case sys.BufferType:
switch a.Kind {
case sys.BufferBlob:
sz := r.randBufLen()
if dir == DirOut {
return nil, constArg(sz), nil
}
data := make([]byte, sz)
for i := range data {
data[i] = byte(r.Intn(256))
}
return dataArg(data), constArg(sz), nil
case sys.BufferString:
data := r.randString(s)
return dataArg(data), constArg(uintptr(len(data))), nil
case sys.BufferFilesystem:
data := r.filesystem(s)
return dataArg(data), constArg(uintptr(len(data))), nil
case sys.BufferSockaddr:
data := r.sockaddr(s)
if dir == DirOut {
return nil, constArg(uintptr(len(data))), nil
}
return dataArg(data), constArg(uintptr(len(data))), nil
case sys.BufferAlgType:
data := r.algType(s)
if dir == DirOut {
for i := range data {
data[i] = 0
}
}
return dataArg(data), constArg(uintptr(len(data))), nil
case sys.BufferAlgName:
data := r.algName(s)
if dir == DirOut {
for i := range data {
data[i] = 0
}
}
//.........這裏部分代碼省略.........
示例4: generateArg
func (r *randGen) generateArg(s *state, typ sys.Type, dir ArgDir, sizes map[string]*Arg) (arg, size *Arg, calls []*Call) {
if dir == DirOut {
// No need to generate something interesting for output scalar arguments.
// But we still need to generate the argument itself so that it can be referenced
// in subsequent calls. For the same reason we do generate pointer/array/struct
// output arguments (their elements can be referenced in subsequent calls).
switch typ.(type) {
case sys.IntType, sys.FlagsType, sys.FileoffType, sys.ResourceType:
return constArg(0), nil, nil
}
}
if typ.Optional() && r.oneOf(10) {
if _, ok := typ.(sys.BufferType); ok {
panic("impossible") // parent PtrType must be Optional instead
}
return constArg(typ.Default()), constArg(0), nil
}
switch a := typ.(type) {
case sys.ResourceType:
r.choose(
1, func() {
special := a.SpecialValues()
arg = constArg(special[r.Intn(len(special))])
},
90, func() {
// Get an existing resource.
if ress := s.resources[a.Kind]; ress != nil {
allres := ress[a.Subkind]
allres = append(allres, ress[sys.ResAny]...)
if a.Subkind == sys.ResAny || r.oneOf(10) {
for _, v := range ress {
allres = append(allres, v...)
}
}
if len(allres) != 0 {
// TODO: negative PIDs mean process group,
// we should be able to negate an existing PID.
arg = resultArg(allres[r.Intn(len(allres))])
}
}
if arg == nil {
arg, calls = r.createResource(s, a)
}
},
10, func() {
// Create a new resource.
arg, calls = r.createResource(s, a)
},
)
return arg, nil, calls
case sys.FileoffType:
// TODO: can do better
var arg *Arg
r.choose(
90, func() { arg = constArg(0) },
10, func() { arg = constArg(r.rand(100)) },
1, func() { arg = constArg(r.randInt()) },
)
return arg, nil, nil
case sys.BufferType:
switch a.Kind {
case sys.BufferBlob:
sz := r.randBufLen()
if dir == DirOut {
return nil, constArg(sz), nil
}
data := make([]byte, sz)
for i := range data {
data[i] = byte(r.Intn(256))
}
return dataArg(data), constArg(sz), nil
case sys.BufferString:
data := r.randString(s)
return dataArg(data), constArg(uintptr(len(data))), nil
case sys.BufferSockaddr:
data := r.sockaddr(s)
if dir == DirOut {
return nil, constArg(uintptr(len(data))), nil
}
return dataArg(data), constArg(uintptr(len(data))), nil
default:
panic("unknown buffer kind")
}
case sys.VmaType:
npages := r.randPageCount()
arg := r.randPageAddr(s, npages, nil)
return arg, pageSizeArg(npages, 0), nil
case sys.FlagsType:
return constArg(r.flags(a.Vals)), nil, nil
case sys.IntType:
v := r.randInt()
if a.Limit != 0 && !r.oneOf(100) {
v %= a.Limit
}
return constArg(v), nil, nil
case sys.FilenameType:
filename := r.filename(s)
return dataArg([]byte(filename)), nil, nil
//.........這裏部分代碼省略.........