golangci / golangci-lint

Fast linters runner for Go
https://golangci-lint.run
GNU General Public License v3.0
15.56k stars 1.38k forks source link

go1.18.1 + some generics code + gocritic = panic (even if the directory/file is excluded) #2784

Closed lopezator closed 2 years ago

lopezator commented 2 years ago

Welcome

Description of the problem

With go1.18.1, some generics code and gocritic enabled, golanci-lint panics like this, even if that directory/file is excluded via --skip-dirs and/or --skip-files:

ERRO [runner] Panic: gocritic: package "slice" (isInitialPkg: true, needAnalyzeSource: true): assertion failed: goroutine 527 [running]:
runtime/debug.Stack()
....
ERRO Running error: 1 error occurred:
        * can't run linter gocritic: gocritic: gocritic: package "slice" (isInitialPkg: true, needAnalyzeSource: true): assertion failed

Repro repo here:

https://github.com/lopezator/gocritic-118

Related with:

https://github.com/golangci/golangci-lint/issues/2649

Version of golangci-lint

```console $ golangci-lint --version golangci-lint has version v1.45.2 built from (unknown, mod sum: "h1:9I3PzkvscJkFAQpTQi5Ga0V4qWdJERajX1UZ7QqkW+I=") on (unknown) ```

Configuration file

```console $ cat .golangci.yml linters: enable: - gocritic disable-all: true linters-settings: gocritic: enabled-tags: - diagnostic - experimental - opinionated - performance - style disabled-checks: - dupImport # https://github.com/go-critic/go-critic/issues/845 - ifElseChain - octalLiteral - whyNoLint - wrapperFunc ```

Go environment

```console $ go version && go env go version go1.18.1 linux/amd64 GO111MODULE="on" GOARCH="amd64" GOBIN="" GOCACHE="/home/myhome/.cache/go-build" GOENV="/home/myhome/.config/go/env" GOEXE="" GOEXPERIMENT="" GOFLAGS="" GOHOSTARCH="amd64" GOHOSTOS="linux" GOINSECURE="" GOMODCACHE="/home/myhome/go/pkg/mod" GONOPROXY="*.mycompany.com" GONOSUMDB="*.mycompany.com" GOOS="linux" GOPATH="/home/myhome/go" GOPRIVATE="*.mycompany.com" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/myhome/go/go1.18.1" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/myhome/go/go1.18.1/pkg/tool/linux_amd64" GOVCS="" GOVERSION="go1.18.1" GCCGO="gccgo" GOAMD64="v1" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="/home/myhome/go/src/github.com/lopezator/gocritic-118/go.mod" GOWORK="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build3194519391=/tmp/go-build -gno-record-gcc-switches" ```

Verbose output of running

```console $ golangci-lint cache clean $ golangci-lint run -v INFO [config_reader] Config search paths: [./ /home/myhome/go/src/github.com/lopezator/gocritic-118 /home/myhome/go/src/github.com/lopezator /home/myhome/go/src/github.com /home/myhome/go/src /home/myhome/go /home/myhome /home /] INFO [config_reader] Used config file .golangci.yml INFO [lintersdb] Active 1 linters: [gocritic] INFO [loader] Go packages loading at mode 575 (compiled_files|deps|exports_file|files|types_sizes|imports|name) took 75.344913ms INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 179.934µs INFO [linters context/goanalysis] analyzers took 575.621134ms with top 10 stages: gocritic: 575.621134ms ERRO [runner] Panic: gocritic: package "slice" (isInitialPkg: true, needAnalyzeSource: true): assertion failed: goroutine 433 [running]: runtime/debug.Stack() /home/myhome/go/go1.18.1/src/runtime/debug/stack.go:24 +0x65 github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func1() /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_action.go:101 +0x155 panic({0x13e2fa0, 0x17e1260}) /home/myhome/go/go1.18.1/src/runtime/panic.go:838 +0x207 go/types.assert(...) /home/myhome/go/go1.18.1/src/go/types/errors.go:21 go/types.(*StdSizes).Sizeof(0xc00004b3e0, {0x17e8eb0?, 0xc000644750}) /home/myhome/go/go1.18.1/src/go/types/sizes.go:159 +0x3a5 github.com/go-critic/go-critic/checkers.(*rangeValCopyChecker).VisitStmt(0xc00547ccc0, {0x17ec1e0?, 0xc0007d00a0?}) /home/myhome/go/pkg/mod/github.com/go-critic/go-critic@v0.6.2/checkers/rangeValCopy_checker.go:68 +0xaa github.com/go-critic/go-critic/checkers/internal/astwalk.(*stmtWalker).WalkFile.func1({0x17e8960?, 0xc0007d00a0?}) /home/myhome/go/pkg/mod/github.com/go-critic/go-critic@v0.6.2/checkers/internal/astwalk/stmt_walker.go:23 +0x62 go/ast.inspector.Visit(0xc0024ad170, {0x17e8960?, 0xc0007d00a0?}) /home/myhome/go/go1.18.1/src/go/ast/walk.go:387 +0x31 go/ast.Walk({0x17e5f20?, 0xc0024ad170?}, {0x17e8960?, 0xc0007d00a0?}) /home/myhome/go/go1.18.1/src/go/ast/walk.go:52 +0x62 go/ast.walkStmtList({0x17e5f20, 0xc0024ad170}, {0xc0008aa080?, 0x5, 0x17ebb20?}) /home/myhome/go/go1.18.1/src/go/ast/walk.go:32 +0x91 go/ast.Walk({0x17e5f20?, 0xc0024ad170?}, {0x17e82d0?, 0xc0007a9d10?}) /home/myhome/go/go1.18.1/src/go/ast/walk.go:235 +0x10e5 go/ast.Inspect(...) /home/myhome/go/go1.18.1/src/go/ast/walk.go:399 github.com/go-critic/go-critic/checkers/internal/astwalk.(*stmtWalker).WalkFile(0xc00246f840?, 0xc0008aa180?) /home/myhome/go/pkg/mod/github.com/go-critic/go-critic@v0.6.2/checkers/internal/astwalk/stmt_walker.go:21 +0x12c github.com/go-critic/go-critic/framework/linter.(*Checker).Check(...) /home/myhome/go/pkg/mod/github.com/go-critic/go-critic@v0.6.2/framework/linter/linter.go:129 github.com/golangci/golangci-lint/pkg/golinters.runGocriticOnFile(0xc001b88240, 0xc0014ad25d?, {0xc00089bc00, 0x61, 0x0?}) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/gocritic.go:181 +0xcc github.com/golangci/golangci-lint/pkg/golinters.runGocriticOnPackage(0xc001b88240, {0xc00089bc00, 0x61, 0x80}, {0xc000010b50, 0x1, 0x0?}) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/gocritic.go:169 +0x1df github.com/golangci/golangci-lint/pkg/golinters.NewGocritic.func1.1(0xc000733ee0) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/gocritic.go:51 +0x217 github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze(0xc000116090) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_action.go:187 +0x9c4 github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2() /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_action.go:105 +0x1d github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage(0xc0007d05a0, {0x1597da3, 0x8}, 0xc00028a748) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/timeutils/stopwatch.go:111 +0x4a github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe(0xc0009d9860?) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_action.go:104 +0x85 github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2(0xc000116090) /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0xb4 created by github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze /home/myhome/go/pkg/mod/github.com/golangci/golangci-lint@v1.45.2/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x1eb WARN [runner] Can't run linter gocritic: gocritic: gocritic: package "slice" (isInitialPkg: true, needAnalyzeSource: true): assertion failed INFO [runner] processing took 2.569µs with stages: max_same_issues: 555ns, nolint: 282ns, skip_dirs: 272ns, max_from_linter: 190ns, cgo: 121ns, skip_files: 119ns, autogenerated_exclude: 119ns, uniq_by_line: 117ns, exclude: 114ns, filename_unadjuster: 107ns, path_prettifier: 102ns, identifier_marker: 92ns, diff: 51ns, max_per_file_from_linter: 50ns, source_code: 50ns, exclude-rules: 48ns, path_shortener: 48ns, severity-rules: 45ns, path_prefixer: 44ns, sort_results: 43ns INFO [runner] linters took 613.445915ms with stages: gocritic: 613.411959ms ERRO Running error: 1 error occurred: * can't run linter gocritic: gocritic: gocritic: package "slice" (isInitialPkg: true, needAnalyzeSource: true): assertion failed INFO Memory: 8 samples, avg is 99.9MB, max is 137.4MB INFO Execution took 693.119062ms ```

Code example or link to a public repository

https://github.com/lopezator/gocritic-118
ldez commented 2 years ago

Hello,

as explained in https://github.com/golangci/golangci-lint/issues/2649#issue-1170906525, some rules in go-critic (hugeParam, rangeValCopy, typeDefFirst, paramTypeCombine) don't work with generics and must be disabled by hand.

lopezator commented 2 years ago

@ldez thanks for your explanation, this issue wasn't about this, but about why we are analyzing the files and folders that are being excluded via --skip-dirs and --skip-files.

Do we have any special reason to do that?

lopezator commented 2 years ago

PTAL to: https://github.com/golangci/golangci-lint/pull/2785

ldez commented 2 years ago

The analysis must have all files because the code needs to compile.