@@ -139,46 +139,11 @@ func (r *runner) isopen(b *ssa.BasicBlock, i int) bool {
139
139
f := c .Fn .(* ssa.Function )
140
140
if r .noImportedNetHTTP (f ) {
141
141
// skip this
142
- continue
142
+ return false
143
143
}
144
144
called := r .isClosureCalled (c )
145
- for _ , b := range f .Blocks {
146
- for i , instr := range b .Instrs {
147
- switch instr := instr .(type ) {
148
- case * ssa.UnOp :
149
- refs := * instr .Referrers ()
150
- if len (refs ) == 0 {
151
- return true
152
- }
153
- for _ , r := range refs {
154
- if v , ok := r .(ssa.Value ); ok {
155
- if ptr , ok := v .Type ().(* types.Pointer ); ! ok || ! isNamedType (ptr .Elem (), "io" , "ReadCloser" ) {
156
- return true
157
- }
158
- vrefs := * v .Referrers ()
159
- for _ , vref := range vrefs {
160
- if vref , ok := vref .(* ssa.UnOp ); ok {
161
- vrefs := * vref .Referrers ()
162
- if len (vrefs ) == 0 {
163
- return true
164
- }
165
- for _ , vref := range vrefs {
166
- if c , ok := vref .(* ssa.Call ); ok {
167
- if c .Call .Method .Name () == closeMethod {
168
- return ! called
169
- }
170
- }
171
- }
172
- }
173
- }
174
- }
175
145
176
- }
177
- default :
178
- return r .isopen (b , i ) || ! called
179
- }
180
- }
181
- }
146
+ return r .calledInFunc (f , called )
182
147
}
183
148
184
149
}
@@ -335,6 +300,47 @@ func (r *runner) noImportedNetHTTP(f *ssa.Function) (ret bool) {
335
300
return true
336
301
}
337
302
303
+ func (r * runner ) calledInFunc (f * ssa.Function , called bool ) bool {
304
+ for _ , b := range f .Blocks {
305
+ for i , instr := range b .Instrs {
306
+ switch instr := instr .(type ) {
307
+ case * ssa.UnOp :
308
+ refs := * instr .Referrers ()
309
+ if len (refs ) == 0 {
310
+ return true
311
+ }
312
+ for _ , r := range refs {
313
+ if v , ok := r .(ssa.Value ); ok {
314
+ if ptr , ok := v .Type ().(* types.Pointer ); ! ok || ! isNamedType (ptr .Elem (), "io" , "ReadCloser" ) {
315
+ return true
316
+ }
317
+ vrefs := * v .Referrers ()
318
+ for _ , vref := range vrefs {
319
+ if vref , ok := vref .(* ssa.UnOp ); ok {
320
+ vrefs := * vref .Referrers ()
321
+ if len (vrefs ) == 0 {
322
+ return true
323
+ }
324
+ for _ , vref := range vrefs {
325
+ if c , ok := vref .(* ssa.Call ); ok {
326
+ if c .Call .Method .Name () == closeMethod {
327
+ return ! called
328
+ }
329
+ }
330
+ }
331
+ }
332
+ }
333
+ }
334
+
335
+ }
336
+ default :
337
+ return r .isopen (b , i ) || ! called
338
+ }
339
+ }
340
+ }
341
+ return false
342
+ }
343
+
338
344
// isNamedType reports whether t is the named type path.name.
339
345
func isNamedType (t types.Type , path , name string ) bool {
340
346
n , ok := t .(* types.Named )
0 commit comments