github.com/jhump/golang-x-tools@v0.0.0-20220218190644-4958d6d39439/go/analysis/passes/nilness/testdata/src/a/a.go (about) 1 package a 2 3 type X struct{ f, g int } 4 5 func f(x, y *X) { 6 if x == nil { 7 print(x.f) // want "nil dereference in field selection" 8 } else { 9 print(x.f) 10 } 11 12 if x == nil { 13 if nil != y { 14 print(1) 15 panic(0) 16 } 17 x.f = 1 // want "nil dereference in field selection" 18 y.f = 1 // want "nil dereference in field selection" 19 } 20 21 var f func() 22 if f == nil { // want "tautological condition: nil == nil" 23 go f() // want "nil dereference in dynamic function call" 24 } else { 25 // This block is unreachable, 26 // so we don't report an error for the 27 // nil dereference in the call. 28 defer f() 29 } 30 } 31 32 func f2(ptr *[3]int, i interface{}) { 33 if ptr != nil { 34 print(ptr[:]) 35 *ptr = [3]int{} 36 print(*ptr) 37 } else { 38 print(ptr[:]) // want "nil dereference in slice operation" 39 *ptr = [3]int{} // want "nil dereference in store" 40 print(*ptr) // want "nil dereference in load" 41 42 if ptr != nil { // want "impossible condition: nil != nil" 43 // Dominated by ptr==nil and ptr!=nil, 44 // this block is unreachable. 45 // We do not report errors within it. 46 print(*ptr) 47 } 48 } 49 50 if i != nil { 51 print(i.(interface{ f() })) 52 } else { 53 print(i.(interface{ f() })) // want "nil dereference in type assertion" 54 } 55 } 56 57 func g() error 58 59 func f3() error { 60 err := g() 61 if err != nil { 62 return err 63 } 64 if err != nil && err.Error() == "foo" { // want "impossible condition: nil != nil" 65 print(0) 66 } 67 ch := make(chan int) 68 if ch == nil { // want "impossible condition: non-nil == nil" 69 print(0) 70 } 71 if ch != nil { // want "tautological condition: non-nil != nil" 72 print(0) 73 } 74 return nil 75 } 76 77 func h(err error, b bool) { 78 if err != nil && b { 79 return 80 } else if err != nil { 81 panic(err) 82 } 83 } 84 85 func i(*int) error { 86 for { 87 if err := g(); err != nil { 88 return err 89 } 90 } 91 } 92 93 func f4(x *X) { 94 if x == nil { 95 panic(x) 96 } 97 } 98 99 func f5(x *X) { 100 panic(nil) // want "panic with nil value" 101 } 102 103 func f6(x *X) { 104 var err error 105 panic(err) // want "panic with nil value" 106 } 107 108 func f7() { 109 x, err := bad() 110 if err != nil { 111 panic(0) 112 } 113 if x == nil { 114 panic(err) // want "panic with nil value" 115 } 116 } 117 118 func bad() (*X, error) { 119 return nil, nil 120 } 121 122 func f8() { 123 var e error 124 v, _ := e.(interface{}) 125 print(v) 126 } 127 128 func f9(x interface { 129 a() 130 b() 131 c() 132 }) { 133 134 x.b() // we don't catch this panic because we don't have any facts yet 135 xx := interface { 136 a() 137 b() 138 }(x) 139 if xx != nil { 140 return 141 } 142 x.c() // want "nil dereference in dynamic method call" 143 xx.b() // want "nil dereference in dynamic method call" 144 xxx := interface{ a() }(xx) 145 xxx.a() // want "nil dereference in dynamic method call" 146 147 if unknown() { 148 panic(x) // want "panic with nil value" 149 } 150 if unknown() { 151 panic(xx) // want "panic with nil value" 152 } 153 if unknown() { 154 panic(xxx) // want "panic with nil value" 155 } 156 } 157 158 func unknown() bool { 159 return false 160 }