Data race in ireturn
hansgylling opened this issue · 2 comments
I found a data race in ireturn. Here's a terminal session where I reproduce it. I'm using the ireturn command to analyze the ireturn code.
$ cd ireturn
$ go version
go version go1.21.3 linux/amd64
$ git pull
Already up-to-date.
$ git status
On branch main
Your branch is up-to-date with 'origin/main'.
nothing to commit, working tree clean
$ go build -race -trimpath -o ireturn cmd/ireturn/main.go
$ ./ireturn ./...
==================
WARNING: DATA RACE
Read at 0x00c000a00058 by goroutine 1701:
github.com/butuzov/ireturn/analyzer/internal/config.(*defaultConfig).Has()
github.com/butuzov/ireturn/analyzer/internal/config/config.go:22 +0x7c
github.com/butuzov/ireturn/analyzer/internal/config.(*allowConfig).IsValid()
github.com/butuzov/ireturn/analyzer/internal/config/allow.go:16 +0xb9
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn/analyzer/analyzer.go:73 +0x2e8
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
golang.org/x/tools/go/analysis/internal/checker.(*action).execOnce()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:767 +0x1641
golang.org/x/tools/go/analysis/internal/checker.(*action).execOnce-fm()
<autogenerated>:1 +0x33
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
golang.org/x/tools/go/analysis/internal/checker.(*action).exec()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:683 +0x4e
golang.org/x/tools/go/analysis/internal/checker.execAll.func1()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:671 +0x26
golang.org/x/tools/go/analysis/internal/checker.execAll.func2()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:677 +0x41
Previous write at 0x00c000a00058 by goroutine 1700:
github.com/butuzov/ireturn/analyzer/internal/config.(*defaultConfig).Has()
github.com/butuzov/ireturn/analyzer/internal/config/config.go:24 +0x9c
github.com/butuzov/ireturn/analyzer/internal/config.(*allowConfig).IsValid()
github.com/butuzov/ireturn/analyzer/internal/config/allow.go:16 +0xb9
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn/analyzer/analyzer.go:73 +0x2e8
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
golang.org/x/tools/go/analysis/internal/checker.(*action).execOnce()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:767 +0x1641
golang.org/x/tools/go/analysis/internal/checker.(*action).execOnce-fm()
<autogenerated>:1 +0x33
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
golang.org/x/tools/go/analysis/internal/checker.(*action).exec()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:683 +0x4e
golang.org/x/tools/go/analysis/internal/checker.execAll.func1()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:671 +0x26
golang.org/x/tools/go/analysis/internal/checker.execAll.func2()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:677 +0x41
Goroutine 1701 (running) created at:
golang.org/x/tools/go/analysis/internal/checker.execAll()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:677 +0x225
golang.org/x/tools/go/analysis/internal/checker.analyze()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:311 +0x228
golang.org/x/tools/go/analysis/internal/checker.Run()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:146 +0xb94
golang.org/x/tools/go/analysis/singlechecker.Main()
golang.org/x/tools@v0.14.0/go/analysis/singlechecker/singlechecker.go:75 +0x3c8
main.main()
main.go:9 +0x24
Goroutine 1700 (finished) created at:
golang.org/x/tools/go/analysis/internal/checker.execAll()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:677 +0x225
golang.org/x/tools/go/analysis/internal/checker.analyze()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:311 +0x228
golang.org/x/tools/go/analysis/internal/checker.Run()
golang.org/x/tools@v0.14.0/go/analysis/internal/checker/checker.go:146 +0xb94
golang.org/x/tools/go/analysis/singlechecker.Main()
golang.org/x/tools@v0.14.0/go/analysis/singlechecker/singlechecker.go:75 +0x3c8
main.main()
main.go:9 +0x24
==================
Found 1 data race(s)
It's also possible to trigger the data race when running ireturn through golangci-lint. That data race doesn't happen when trying to analyze the ireturn code repo, so I will show it by running it on the golangci-lint code instead.
$ cd golangci-lint
$ go build -race -trimpath -o golangci-lint cmd/golangci-lint/main.go
$ ./golangci-lint run --no-config --disable-all -E ireturn
==================
WARNING: DATA RACE
Read at 0x00c0000cda20 by goroutine 6238:
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:91 +0x2c4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Previous write at 0x00c0000cda20 by goroutine 6236:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x608
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Goroutine 6238 (running) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
Goroutine 6236 (finished) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1.1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:43 +0x4b
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1.2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:45 +0x41
==================
==================
WARNING: DATA RACE
Read at 0x00c00429c690 by goroutine 6238:
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:92 +0x364
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Previous write at 0x00c00429c690 by goroutine 6236:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x5b3
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Goroutine 6238 (running) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
Goroutine 6236 (finished) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1.1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:43 +0x4b
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1.2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:45 +0x41
==================
==================
WARNING: DATA RACE
Write at 0x00c0000cda20 by goroutine 6284:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x608
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Previous read at 0x00c0000cda20 by goroutine 6282:
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:92 +0x408
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Goroutine 6284 (running) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
Goroutine 6282 (finished) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
==================
==================
WARNING: DATA RACE
Read at 0x00c004c20d98 by goroutine 6290:
runtime.growslice()
runtime/slice.go:157 +0x0
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x57d
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Previous write at 0x00c004c20d98 by goroutine 6284:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x5b3
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Goroutine 6290 (running) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
Goroutine 6284 (finished) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
==================
==================
WARNING: DATA RACE
Read at 0x00c0000cda20 by goroutine 6298:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x544
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Previous write at 0x00c0000cda20 by goroutine 6295:
github.com/butuzov/ireturn/analyzer.(*analyzer).run.func3()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:86 +0x608
golang.org/x/tools/go/ast/inspector.(*Inspector).Preorder()
golang.org/x/tools@v0.14.0/go/ast/inspector/inspector.go:82 +0x111
github.com/butuzov/ireturn/analyzer.(*analyzer).run()
github.com/butuzov/ireturn@v0.2.0/analyzer/analyzer.go:53 +0x2a4
github.com/butuzov/ireturn/analyzer.(*analyzer).run-fm()
<autogenerated>:1 +0x3d
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:195 +0x15a3
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:113 +0x2e
github.com/golangci/golangci-lint/pkg/timeutils.(*Stopwatch).TrackStage()
github.com/golangci/golangci-lint/pkg/timeutils/stopwatch.go:111 +0x56
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*action).analyzeSafe()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_action.go:112 +0x11a
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:80 +0x189
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze.func4()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:81 +0x41
Goroutine 6298 (running) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
Goroutine 6295 (finished) created at:
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyze()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:75 +0x336
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive.func1()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:48 +0x2dc
sync.(*Once).doSlow()
sync/once.go:74 +0xf0
sync.(*Once).Do()
sync/once.go:65 +0x44
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*loadingPackage).analyzeRecursive()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner_loadingpackage.go:37 +0x6f
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func2()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:274 +0x64
github.com/golangci/golangci-lint/pkg/golinters/goanalysis.(*runner).analyze.func3()
github.com/golangci/golangci-lint/pkg/golinters/goanalysis/runner.go:276 +0x41
==================
pkg/logutils/mock.go:40:1: Child returns interface (github.com/golangci/golangci-lint/pkg/logutils.Log) (ireturn)
func (m *MockLog) Child(name string) Log {
^
pkg/logutils/stderr_log.go:115:1: Child returns interface (github.com/golangci/golangci-lint/pkg/logutils.Log) (ireturn)
func (sl StderrLog) Child(name string) Log {
^
pkg/report/log.go:50:1: Child returns interface (github.com/golangci/golangci-lint/pkg/logutils.Log) (ireturn)
func (lw LogWrapper) Child(name string) logutils.Log {
^
pkg/printers/github.go:18:1: NewGithub returns interface (github.com/golangci/golangci-lint/pkg/printers.Printer) (ireturn)
func NewGithub(w io.Writer) Printer {
^
pkg/lint/runner.go:257:1: getExcludeProcessor returns interface (github.com/golangci/golangci-lint/pkg/result/processors.Processor) (ireturn)
func getExcludeProcessor(cfg *config.Issues) processors.Processor {
^
pkg/lint/runner.go:274:1: getExcludeRulesProcessor returns interface (github.com/golangci/golangci-lint/pkg/result/processors.Processor) (ireturn)
func getExcludeRulesProcessor(cfg *config.Issues, log logutils.Log, files *fsutils.Files) processors.Processor {
^
pkg/lint/runner.go:317:1: getSeverityRulesProcessor returns interface (github.com/golangci/golangci-lint/pkg/result/processors.Processor) (ireturn)
func getSeverityRulesProcessor(cfg *config.Severity, log logutils.Log, files *fsutils.Files) processors.Processor {
^
pkg/golinters/goanalysis/runner_facts.go:79:1: codeFact returns interface (golang.org/x/tools/go/analysis.Fact) (ireturn)
func codeFact(fact analysis.Fact) (analysis.Fact, error) {
^
pkg/commands/run.go:460:1: createPrinter returns interface (github.com/golangci/golangci-lint/pkg/printers.Printer) (ireturn)
func (e *Executor) createPrinter(format string, w io.Writer) (printers.Printer, error) {
^
pkg/result/processors/sort_results.go:93:1: Next returns interface (github.com/golangci/golangci-lint/pkg/result/processors.comparator) (ireturn)
func (cmp ByName) Next() comparator { return cmp.next }
^
pkg/result/processors/sort_results.go:111:1: Next returns interface (github.com/golangci/golangci-lint/pkg/result/processors.comparator) (ireturn)
func (cmp ByLine) Next() comparator { return cmp.next }
^
pkg/result/processors/sort_results.go:129:1: Next returns interface (github.com/golangci/golangci-lint/pkg/result/processors.comparator) (ireturn)
func (cmp ByColumn) Next() comparator { return cmp.next }
^
The stack trace looks similar to the data race bug I reported in May for the mirror tool (butuzov/mirror#17). Hopefully the same technique can be used to fix this problem in ireturn.
I hope you will have some time to fix this, but I understand if it might take a while, or perhaps, a long time. I wish you and your country luck in your struggles.
Thank you for noticing this. BTW, is codebase you testing it is public?
Bug is still there, reopening.