funcs.go 1.1 KB

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