f.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. package testing
  2. import (
  3. "fmt"
  4. fuzz "github.com/AdaLogics/go-fuzz-headers"
  5. "os"
  6. "reflect"
  7. )
  8. type F struct {
  9. Data []byte
  10. T *T
  11. FuzzFunc func(*T, any)
  12. }
  13. func (f *F) CleanupTempDirs() {
  14. f.T.CleanupTempDirs()
  15. }
  16. func (f *F) Add(args ...any) {}
  17. func (c *F) Cleanup(f func()) {}
  18. func (c *F) Error(args ...any) {}
  19. func (c *F) Errorf(format string, args ...any) {}
  20. func (f *F) Fail() {}
  21. func (c *F) FailNow() {}
  22. func (c *F) Failed() bool { return false }
  23. func (c *F) Fatal(args ...any) {}
  24. func (c *F) Fatalf(format string, args ...any) {}
  25. func (f *F) Fuzz(ff any) {
  26. // we are assuming that ff is a func.
  27. // TODO: Add a check for UX purposes
  28. fn := reflect.ValueOf(ff)
  29. fnType := fn.Type()
  30. var types []reflect.Type
  31. for i := 1; i < fnType.NumIn(); i++ {
  32. t := fnType.In(i)
  33. types = append(types, t)
  34. }
  35. args := []reflect.Value{reflect.ValueOf(f.T)}
  36. fuzzConsumer := fuzz.NewConsumer(f.Data)
  37. for _, v := range types {
  38. switch v.String() {
  39. case "[]uint8":
  40. b, err := fuzzConsumer.GetBytes()
  41. if err != nil {
  42. return
  43. }
  44. newBytes := reflect.New(v)
  45. newBytes.Elem().SetBytes(b)
  46. args = append(args, newBytes.Elem())
  47. case "string":
  48. s, err := fuzzConsumer.GetString()
  49. if err != nil {
  50. return
  51. }
  52. newString := reflect.New(v)
  53. newString.Elem().SetString(s)
  54. args = append(args, newString.Elem())
  55. case "int":
  56. randInt, err := fuzzConsumer.GetInt()
  57. if err != nil {
  58. return
  59. }
  60. newInt := reflect.New(v)
  61. newInt.Elem().SetInt(int64(randInt))
  62. args = append(args, newInt.Elem())
  63. case "int8":
  64. randInt, err := fuzzConsumer.GetInt()
  65. if err != nil {
  66. return
  67. }
  68. newInt := reflect.New(v)
  69. newInt.Elem().SetInt(int64(randInt))
  70. args = append(args, newInt.Elem())
  71. case "int16":
  72. randInt, err := fuzzConsumer.GetInt()
  73. if err != nil {
  74. return
  75. }
  76. newInt := reflect.New(v)
  77. newInt.Elem().SetInt(int64(randInt))
  78. args = append(args, newInt.Elem())
  79. case "int32":
  80. randInt, err := fuzzConsumer.GetInt()
  81. if err != nil {
  82. return
  83. }
  84. newInt := reflect.New(v)
  85. newInt.Elem().SetInt(int64(randInt))
  86. args = append(args, newInt.Elem())
  87. case "int64":
  88. randInt, err := fuzzConsumer.GetInt()
  89. if err != nil {
  90. return
  91. }
  92. newInt := reflect.New(v)
  93. newInt.Elem().SetInt(int64(randInt))
  94. args = append(args, newInt.Elem())
  95. case "uint":
  96. randInt, err := fuzzConsumer.GetInt()
  97. if err != nil {
  98. return
  99. }
  100. newUint := reflect.New(v)
  101. newUint.Elem().SetUint(uint64(randInt))
  102. args = append(args, newUint.Elem())
  103. case "uint8":
  104. randInt, err := fuzzConsumer.GetInt()
  105. if err != nil {
  106. return
  107. }
  108. newUint := reflect.New(v)
  109. newUint.Elem().SetUint(uint64(randInt))
  110. args = append(args, newUint.Elem())
  111. case "uint16":
  112. randInt, err := fuzzConsumer.GetUint16()
  113. if err != nil {
  114. return
  115. }
  116. newUint16 := reflect.New(v)
  117. newUint16.Elem().SetUint(uint64(randInt))
  118. args = append(args, newUint16.Elem())
  119. case "uint32":
  120. randInt, err := fuzzConsumer.GetUint32()
  121. if err != nil {
  122. return
  123. }
  124. newUint32 := reflect.New(v)
  125. newUint32.Elem().SetUint(uint64(randInt))
  126. args = append(args, newUint32.Elem())
  127. case "uint64":
  128. randInt, err := fuzzConsumer.GetUint64()
  129. if err != nil {
  130. return
  131. }
  132. newUint64 := reflect.New(v)
  133. newUint64.Elem().SetUint(uint64(randInt))
  134. args = append(args, newUint64.Elem())
  135. case "rune":
  136. randRune, err := fuzzConsumer.GetRune()
  137. if err != nil {
  138. return
  139. }
  140. newRune := reflect.New(v)
  141. newRune.Elem().Set(reflect.ValueOf(randRune))
  142. args = append(args, newRune.Elem())
  143. case "float32":
  144. randFloat, err := fuzzConsumer.GetFloat32()
  145. if err != nil {
  146. return
  147. }
  148. newFloat := reflect.New(v)
  149. newFloat.Elem().Set(reflect.ValueOf(randFloat))
  150. args = append(args, newFloat.Elem())
  151. case "float64":
  152. randFloat, err := fuzzConsumer.GetFloat64()
  153. if err != nil {
  154. return
  155. }
  156. newFloat := reflect.New(v)
  157. newFloat.Elem().Set(reflect.ValueOf(randFloat))
  158. args = append(args, newFloat.Elem())
  159. case "bool":
  160. randBool, err := fuzzConsumer.GetBool()
  161. if err != nil {
  162. return
  163. }
  164. newBool := reflect.New(v)
  165. newBool.Elem().Set(reflect.ValueOf(randBool))
  166. args = append(args, newBool.Elem())
  167. default:
  168. fmt.Println(v.String())
  169. }
  170. }
  171. fn.Call(args)
  172. }
  173. func (f *F) Helper() {}
  174. func (c *F) Log(args ...any) {
  175. fmt.Println(args...)
  176. }
  177. func (c *F) Logf(format string, args ...any) {
  178. fmt.Println(format, args)
  179. }
  180. func (c *F) Name() string { return "libFuzzer" }
  181. func (c *F) Setenv(key, value string) {}
  182. func (c *F) Skip(args ...any) {
  183. panic("GO-FUZZ-BUILD-PANIC")
  184. }
  185. func (c *F) SkipNow() {
  186. panic("GO-FUZZ-BUILD-PANIC")
  187. }
  188. func (c *F) Skipf(format string, args ...any) {
  189. panic("GO-FUZZ-BUILD-PANIC")
  190. }
  191. func (f *F) Skipped() bool { return false }
  192. func (f *F) TempDir() string {
  193. dir, err := os.MkdirTemp("", "fuzzdir-")
  194. if err != nil {
  195. panic(err)
  196. }
  197. f.T.TempDirs = append(f.T.TempDirs, dir)
  198. return dir
  199. }