diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2021-02-22 20:37:25 +0100 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2021-02-22 21:02:12 +0100 |
| commit | fcc6d71be2c3ce7d9305c04fc2e87af554571bac (patch) | |
| tree | b01dbb3d1e2988e28ea158d2d543d603ec0b9569 /vendor/github.com/jingyugao | |
| parent | 8f23c528ad5a943b9ffec5dcaf332fd0f614006e (diff) | |
go.mod: update golangci-lint to v1.37
Diffstat (limited to 'vendor/github.com/jingyugao')
| -rw-r--r-- | vendor/github.com/jingyugao/rowserrcheck/passes/rowserr/rowserr.go | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/vendor/github.com/jingyugao/rowserrcheck/passes/rowserr/rowserr.go b/vendor/github.com/jingyugao/rowserrcheck/passes/rowserr/rowserr.go index 7b8c64f4c..1a3e96dec 100644 --- a/vendor/github.com/jingyugao/rowserrcheck/passes/rowserr/rowserr.go +++ b/vendor/github.com/jingyugao/rowserrcheck/passes/rowserr/rowserr.go @@ -39,10 +39,10 @@ type runner struct { func NewRun(pkgs ...string) func(pass *analysis.Pass) (interface{}, error) { return func(pass *analysis.Pass) (interface{}, error) { - pkgs = append(pkgs, "database/sql") - for _, pkg := range pkgs { + sqlPkgs := append(pkgs, "database/sql") + for _, pkg := range sqlPkgs { r := new(runner) - r.sqlPkgs = pkgs + r.sqlPkgs = sqlPkgs r.run(pass, pkg) } return nil, nil @@ -107,7 +107,7 @@ func (r runner) run(pass *analysis.Pass, pkgPath string) (interface{}, error) { return nil, nil } -func (r *runner) notCheck(b *ssa.BasicBlock, i int) bool { +func (r *runner) notCheck(b *ssa.BasicBlock, i int) (ret bool) { call, ok := r.getReqCall(b.Instrs[i]) if !ok { return false @@ -118,14 +118,22 @@ func (r *runner) notCheck(b *ssa.BasicBlock, i int) bool { if !ok { continue } - if len(*val.Referrers()) == 0 { return true } resRefs := *val.Referrers() - for _, resRef := range resRefs { + var notCallClose func(resRef ssa.Instruction) bool + notCallClose = func(resRef ssa.Instruction) bool { switch resRef := resRef.(type) { + case *ssa.Phi: + resRefs = append(resRefs, (*resRef.Referrers())...) + for _, rf := range *resRef.Referrers() { + if !notCallClose(rf) { + return false + } + } + case *ssa.Store: // Call in Closure function if len(*resRef.Addr.Referrers()) == 0 { return true @@ -168,10 +176,17 @@ func (r *runner) notCheck(b *ssa.BasicBlock, i int) bool { } } } + } + return true } - } + for _, resRef := range resRefs { + if !notCallClose(resRef) { + return false + } + } + } return true } @@ -205,6 +220,7 @@ func (r *runner) getResVal(instr ssa.Instruction) (ssa.Value, bool) { if types.Identical(instr.Type(), r.rowsTyp) { return instr, true } + default: } return nil, false |
