From 456891f089dfc3817c306f41d411f89b38e0838f Mon Sep 17 00:00:00 2001 From: ma91n Date: Fri, 6 Sep 2024 16:50:29 +0900 Subject: [PATCH] handling body is declared before if blocks --- passes/bodyclose/bodyclose.go | 28 ++++++++++++++++++++++ passes/bodyclose/testdata/src/a/issue61.go | 13 ++++++++++ 2 files changed, 41 insertions(+) create mode 100644 passes/bodyclose/testdata/src/a/issue61.go diff --git a/passes/bodyclose/bodyclose.go b/passes/bodyclose/bodyclose.go index 27042a1..ce13614 100644 --- a/passes/bodyclose/bodyclose.go +++ b/passes/bodyclose/bodyclose.go @@ -195,6 +195,34 @@ func (r *runner) isopen(b *ssa.BasicBlock, i int) bool { } } } + case *ssa.Phi: // Called in the higher-level block + if resRef.Referrers() == nil { + return true + } + + bRefs := *resRef.Referrers() + + for _, bRef := range bRefs { + switch instr := bRef.(type) { + case *ssa.FieldAddr: + bRefs := *instr.Referrers() + for _, bRef := range bRefs { + bOp, ok := r.getBodyOp(bRef) + if !ok { + continue + } + if len(*bOp.Referrers()) == 0 { + return true + } + ccalls := *bOp.Referrers() + for _, ccall := range ccalls { + if r.isCloseCall(ccall) { + return false + } + } + } + } + } } } } diff --git a/passes/bodyclose/testdata/src/a/issue61.go b/passes/bodyclose/testdata/src/a/issue61.go new file mode 100644 index 0000000..b7e0930 --- /dev/null +++ b/passes/bodyclose/testdata/src/a/issue61.go @@ -0,0 +1,13 @@ +package a + +import ( + "net/http" +) + +func issue61() { + var resp *http.Response + if true { + resp, _ = http.Get("http://example.com") // OK + } + defer resp.Body.Close() +}