...
1
16
17 package fuzzer
18
19 import (
20 "reflect"
21 )
22
23
24
25 func ValueFuzz(obj interface{}) {
26 valueFuzz(reflect.ValueOf(obj))
27 }
28
29 func valueFuzz(obj reflect.Value) {
30 switch obj.Kind() {
31 case reflect.Array:
32 for i := 0; i < obj.Len(); i++ {
33 valueFuzz(obj.Index(i))
34 }
35 case reflect.Slice:
36 if obj.IsNil() {
37
38 } else {
39 for i := 0; i < obj.Len(); i++ {
40 valueFuzz(obj.Index(i))
41 }
42 }
43 case reflect.Interface, reflect.Pointer:
44 if obj.IsNil() {
45
46 } else {
47 valueFuzz(obj.Elem())
48 }
49 case reflect.Struct:
50 for i, n := 0, obj.NumField(); i < n; i++ {
51 valueFuzz(obj.Field(i))
52 }
53 case reflect.Map:
54 if obj.IsNil() {
55
56 } else {
57 for _, k := range obj.MapKeys() {
58
59 v := obj.MapIndex(k)
60 copy := reflect.New(v.Type())
61 copy.Elem().Set(v)
62 valueFuzz(copy.Elem())
63 obj.SetMapIndex(k, copy.Elem())
64 }
65
66 }
67 case reflect.Func:
68 default:
69 if !obj.CanSet() {
70 return
71 }
72 switch obj.Kind() {
73 case reflect.String:
74 obj.SetString(obj.String() + "x")
75 case reflect.Bool:
76 obj.SetBool(!obj.Bool())
77 case reflect.Float32, reflect.Float64:
78 obj.SetFloat(obj.Float()*2.0 + 1.0)
79 case reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, reflect.Int:
80 obj.SetInt(obj.Int() + 1)
81 case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uint:
82 obj.SetUint(obj.Uint() + 1)
83 default:
84 }
85 }
86 }
87
View as plain text