Skip to content

fix: panic with defer inside for loop - #50

Open
ldez wants to merge 1 commit into
ryanrolds:mainfrom
golangci:fix/panic-unreachable
Open

fix: panic with defer inside for loop#50
ldez wants to merge 1 commit into
ryanrolds:mainfrom
golangci:fix/panic-unreachable

Conversation

@ldez

@ldezldez commented Mar 29, 2026

Copy link
Copy Markdown
$ sqlclosecheck ./...panic: unreachablegoroutine 802 [running]:go/types.(*comparer).identical(0x2413e9282af6, {0x866530?, 0xb31df0?}, {0x865e28?, 0x2413f1724080?}, 0x0) /usr/lib/go/src/go/types/predicates.go:497 +0x805go/types.(*comparer).identical(0x2413e9282af6, {0x865e00?, 0xb31de0?}, {0x865e00?, 0x2413effb8e20?}, 0x0) /usr/lib/go/src/go/types/predicates.go:311 +0x6ffgo/types.Identical(...) /usr/lib/go/src/go/types/api_predicates.go:90github.com/ryanrolds/sqlclosecheck/pkg/analyzer.getTargetTypesValues(0x2413effba880?, 0xb3bb20?, {0x2413edbb40c0, 0x3, 0x48341e?}) sqlclosecheck/pkg/analyzer/defer_only.go:189 +0x1c5github.com/ryanrolds/sqlclosecheck/pkg/analyzer.(*deferOnlyAnalyzer).Run(0x800200?, 0x2413ed9dbc00) sqlclosecheck/pkg/analyzer/defer_only.go:69 +0x19egithub.com/ryanrolds/sqlclosecheck/pkg/analyzer.run(0x7d78e0?) sqlclosecheck/pkg/analyzer/analyzer.go:19 +0x1bgolang.org/x/tools/go/analysis/checker.(*Action).execOnce.func3(...) sqlclosecheck/vendor/golang.org/x/tools/go/analysis/checker/checker.go:359golang.org/x/tools/go/analysis/checker.(*Action).execOnce(0x2413f16a81e0) sqlclosecheck/vendor/golang.org/x/tools/go/analysis/checker/checker.go:380 +0xb9csync.(*Once).doSlow(0x2413f1a26900?, 0x6e1ee0?) /usr/lib/go/src/sync/once.go:78 +0xacsync.(*Once).Do(...) /usr/lib/go/src/sync/once.go:69golang.org/x/tools/go/analysis/checker.(*Action).exec(...) sqlclosecheck/vendor/golang.org/x/tools/go/analysis/checker/checker.go:258golang.org/x/tools/go/analysis/checker.execAll.func1(0x2413ef7da798?) sqlclosecheck/vendor/golang.org/x/tools/go/analysis/checker/checker.go:246 +0x45created by golang.org/x/tools/go/analysis/checker.execAll in goroutine 1 sqlclosecheck/vendor/golang.org/x/tools/go/analysis/checker/checker.go:252 +0x147
Example
package main
import (
"context""database/sql""fmt""iter""sync"
)
typedbstruct {
mu sync.Mutexremotesmap[string]*sql.DB
}
func (db*db) All() iter.Seq2[string, *sql.DB] {
returnfunc(yieldfunc(string, *sql.DB) bool) {
db.mu.Lock()
deferdb.mu.Unlock()
foraddr, r:=rangedb.remotes {
if!yield(addr, r) {
return
}
}
}
}
func (db*db) Foo(ctx context.Context) error {
foraddr, rem:=rangedb.All() {
rconn, err:=rem.Conn(context.Background())
iferr!=nil {
returnerr
}
deferrconn.Close()
rows, err:=rconn.QueryContext(ctx, `SELECT * FROM foo`)
iferr!=nil {
returnerr
}
deferrows.Close()
forrows.Next() {
fmt.Println(rows.ColumnTypes())
}
iferr:=rows.Err(); err!=nil {
returnerr
}
fmt.Println(addr, rconn.PingContext(context.Background()))
}
returnnil
}
funcmain() {
d:=&db{remotes: make(map[string]*sql.DB)}
fmt.Println(d.Foo(context.Background()))
}

Related to golangci/golangci-lint#6467

@ldez

ldez commented Apr 18, 2026

Copy link
Copy Markdown
Author

@ryanrolds friendly ping

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@ldez