...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package gofuzzheaders
16
17 import (
18 "fmt"
19 "reflect"
20 )
21
22 type Continue struct {
23 F *ConsumeFuzzer
24 }
25
26 func (f *ConsumeFuzzer) AddFuncs(fuzzFuncs []interface{}) {
27 for i := range fuzzFuncs {
28 v := reflect.ValueOf(fuzzFuncs[i])
29 if v.Kind() != reflect.Func {
30 panic("Need only funcs!")
31 }
32 t := v.Type()
33 if t.NumIn() != 2 || t.NumOut() != 1 {
34 fmt.Println(t.NumIn(), t.NumOut())
35
36 panic("Need 2 in and 1 out params. In must be the type. Out must be an error")
37 }
38 argT := t.In(0)
39 switch argT.Kind() {
40 case reflect.Ptr, reflect.Map:
41 default:
42 panic("fuzzFunc must take pointer or map type")
43 }
44 if t.In(1) != reflect.TypeOf(Continue{}) {
45 panic("fuzzFunc's second parameter must be type Continue")
46 }
47 f.Funcs[argT] = v
48 }
49 }
50
51 func (f *ConsumeFuzzer) GenerateWithCustom(targetStruct interface{}) error {
52 e := reflect.ValueOf(targetStruct).Elem()
53 return f.fuzzStruct(e, true)
54 }
55
56 func (c Continue) GenerateStruct(targetStruct interface{}) error {
57 return c.F.GenerateStruct(targetStruct)
58 }
59
60 func (c Continue) GenerateStructWithCustom(targetStruct interface{}) error {
61 return c.F.GenerateWithCustom(targetStruct)
62 }
63
View as plain text