Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

unused doesn't work with "exported-is-used" and "exported-fields-are-used" linter settings #4218

Open
5 tasks done
pietdevries94 opened this issue Nov 22, 2023 · 8 comments
Open
5 tasks done
Assignees
Labels
bug Something isn't working

Comments

@pietdevries94
Copy link

pietdevries94 commented Nov 22, 2023

Welcome

Description of the problem

When using unused with either "exported-is-used" or "exported-fields-are-used" linter settings or both, golangci-lint panics.

I have both tried in go 1.20 and 1.21

Version of golangci-lint

$ golangci-lint --version
golangci-lint has version 1.55.2 built with go1.21.3 from e3c2265f on 2023-11-03T12:59:25Z

Configuration

linters:
  enable:
    - unused
linters-settings:
  unused:
    exported-is-used: false
    exported-fields-are-used: false

Go environment

$ go version && go env
go version go1.20.8 linux/amd64
GO111MODULE=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/piet/.cache/go-build"
GOENV="/home/piet/.config/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOINSECURE=""
GOMODCACHE="/home/piet/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/piet/go"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/nix/store/cbfw4zvybzvhvqb14a14pwpsvcnnpjcg-go-1.20.8/share/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/nix/store/cbfw4zvybzvhvqb14a14pwpsvcnnpjcg-go-1.20.8/share/go/pkg/tool/linux_amd64"
GOVCS=""
GOVERSION="go1.20.8"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/tmp/tmp.PJ3iHlw0ZJ/go.mod"
GOWORK=""
CGO_CFLAGS="-O2 -g"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-O2 -g"
CGO_FFLAGS="-O2 -g"
CGO_LDFLAGS="-O2 -g"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -Wl,--no-gc-sections -fmessage-length=0 -fdebug-prefix-map=/run/user/1000/go-build3312085719=/tmp/go-build -gno-record-gcc-switches"

Verbose output of running

$ golangci-lint cache clean
$ golangci-lint run -v
INFO [config_reader] Config search paths: [./ /tmp/tmp.PJ3iHlw0ZJ /tmp / /home/piet] 
INFO [config_reader] Used config file .golangci.yml 
INFO [lintersdb] Active 6 linters: [errcheck gosimple govet ineffassign staticcheck unused] 
INFO [loader] Go packages loading at mode 575 (exports_file|types_sizes|compiled_files|deps|files|imports|name) took 49.598673ms 
INFO [runner/filename_unadjuster] Pre-built 0 adjustments in 94.55µs 
INFO [linters_context/goanalysis] analyzers took 779.556298ms with top 10 stages: buildir: 616.212553ms, inspect: 37.842009ms, SA5012: 22.853563ms, printf: 20.040602ms, ctrlflow: 19.631335ms, fact_deprecated: 18.408188ms, fact_purity: 16.0611ms, nilness: 12.353816ms, typedness: 10.489409ms, S1005: 190.001µs 
ERRO [runner] Panic: unused: package "something" (isInitialPkg: true, needAnalyzeSource: true): object "string" has no path but also no column information: goroutine 386 [running]:
runtime/debug.Stack()
        runtime/debug/stack.go:24 +0x5e
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func1()
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:109 +0x27c
panic({0xf8a380?, 0xc0009cc330?})
        runtime/panic.go:914 +0x21f
honnef.co/go/tools/unused.(*SerializedGraph).Merge(0xc001489680, {0xc0001c0a80, 0x4, 0xc0001b5308?})
        honnef.co/go/tools@v0.4.6/unused/serialize.go:52 +0xdde
github.com/golangci/golangci-lint/pkg/golinters.getUnusedResults(0xc000f5e5b0, 0x2070696b7320646c?)
        github.com/golangci/golangci-lint/pkg/golinters/unused.go:110 +0x1f6
github.com/golangci/golangci-lint/pkg/golinters.runUnused(0xc000f5e5b0, 0xc0007e8b78?)
        github.com/golangci/golangci-lint/pkg/golinters/unused.go:56 +0x2a
github.com/golangci/golangci-lint/pkg/golinters.NewUnused.func1(0xfd94e0?)
        github.com/golangci/golangci-lint/pkg/golinters/unused.go:30 +0x2d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze(0xc000ea4db0)
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x9d6
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x17
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage(0xc0014108c0, {0x112dc5e, 0x6}, 0xc000f88748)
        github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe(0x7d0a7d7b65756575?)
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x7a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2(0xc000ea4db0)
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0xa8
created by github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze in goroutine 142
        github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x205 
WARN [runner] Can't run linter goanalysis_metalinter: goanalysis_metalinter: unused: package "something" (isInitialPkg: true, needAnalyzeSource: true): object "string" has no path but also no column information 
INFO [runner] processing took 2.764µs with stages: skip_dirs: 531ns, max_same_issues: 521ns, nolint: 201ns, autogenerated_exclude: 150ns, cgo: 140ns, path_prettifier: 130ns, filename_unadjuster: 130ns, max_from_linter: 130ns, skip_files: 121ns, identifier_marker: 120ns, source_code: 120ns, fixer: 110ns, diff: 50ns, exclude-rules: 50ns, path_shortener: 40ns, path_prefixer: 40ns, sort_results: 40ns, severity-rules: 40ns, exclude: 40ns, uniq_by_line: 30ns, max_per_file_from_linter: 30ns 
INFO [runner] linters took 678.204076ms with stages: goanalysis_metalinter: 678.174341ms 
ERRO Running error: 1 error occurred:
        * can't run linter goanalysis_metalinter: goanalysis_metalinter: unused: package "something" (isInitialPkg: true, needAnalyzeSource: true): object "string" has no path but also no column information
 
INFO Memory: 9 samples, avg is 154.4MB, max is 232.3MB 
INFO Execution took 733.799125ms

A minimal reproducible example or link to a public repository

https://github.com/pietdevries94/golangci-lint-unused-reproduction

Validation

  • Yes, I've included all information above (version, config, etc.).
@pietdevries94 pietdevries94 added the bug Something isn't working label Nov 22, 2023
Copy link

boring-cyborg bot commented Nov 22, 2023

Hey, thank you for opening your first Issue ! 🙂 If you would like to contribute we have a guide for contributors.

@ldez
Copy link
Member

ldez commented Nov 22, 2023

Hello,

sadly we cannot filter the elements that produce the panic because it's related to unexported fields, so I think we will remove the options exported-is-used and exported-fields-are-used.

@pietdevries94
Copy link
Author

That’s a shame… I would love to properly detect dead code in a rather large repository with no external dependents, so exported types should be imported elsewhere. Nevertheless, if it’s not feasible to fix this, I’ll have to search further

@ZackaryWelch
Copy link

I've been able to use exported-fields-are-used, but I saw the same error with exported-is-used. I want to try to dig in further and see what's going on, since this is the main linting functionality that is only present on Goland.

@rusinikita
Copy link

Looks like problem in dependency (honnef.co/go/tools). It looks like it was not ready for some values.

I enabled exported-is-used: false in golangci-lint repository and hit run with debuger. I got panic on exitcodes.go validation. Iota node has no path and position, but has id.

Screenshot 2024-01-09 at 23 17 09 Screenshot 2024-01-09 at 23 17 17

@ldez
Copy link
Member

ldez commented Jan 9, 2024

#4218 (comment)

@ldez ldez self-assigned this Jan 9, 2024
@leonklingele
Copy link
Member

exported-fields-are-used works fine for me on multiple projects, exported-is-used however doesn't.
Probably best to remove that one option from golangci for the time being.

Also see dominikh/go-tools#1474 and dominikh/go-tools#1385.

@wipsel

This comment was marked as off-topic.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

6 participants