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

x/tools/gopls: copylock warning not shown/detected by the language server #51328

Closed
katexochen opened this issue Feb 21, 2022 · 4 comments
Closed
Labels
Analysis Issues related to static analysis (vet, x/tools/go/analysis) FrozenDueToAge gopls/analysis Issues related to running analysis in gopls gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Milestone

Comments

@katexochen
Copy link

What version of Go, VS Code & VS Code Go extension are you using?

Version Information
  • Run go version to get version of Go from the VS Code integrated terminal.
    • go version go1.17.1 linux/amd64
  • Run gopls -v version to get version of Gopls from the VS Code integrated terminal.
        Build info
        ----------
        golang.org/x/tools/gopls v0.7.5
            golang.org/x/tools/gopls@v0.7.5 h1:8Az52YwcFXTWPvrRomns1C0N+zlgTyyPKWvRazO9GG8=
            github.com/BurntSushi/toml@v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
            github.com/google/go-cmp@v0.5.6 h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
            github.com/sergi/go-diff@v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
            golang.org/x/mod@v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
            golang.org/x/sync@v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
            golang.org/x/sys@v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
            golang.org/x/text@v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
            golang.org/x/tools@v0.1.9-0.20220114220130-fd7798718afd h1:lTnuArxJC+n54TyvWUPyHhrnGxYvhSi13/aM2Ndr4bs=
            golang.org/x/xerrors@v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
            honnef.co/go/tools@v0.2.1 h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY=
            mvdan.cc/gofumpt@v0.1.1 h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA=
            mvdan.cc/xurls/v2@v2.3.0 h1:59Olnbt67UKpxF1EwVBopJvkSUBmgtb468E4GVWIZ1I=
    
  • Run code -v or code-insiders -v to get version of VS Code or VS Code Insiders.
         1.64.2
         f80445acd5a3dadef24aa209168452a3d97cc326
         x64
    
  • Check your installed extensions to get the version of the VS Code Go extension
    • v0.31.1
  • Run Ctrl+Shift+P (Cmd+Shift+P on Mac OS) > Go: Locate Configured Go Tools command.
Checking configured tools....
GOBIN: undefined
toolsGopath: 
gopath: /home/katexochen/go
GOROOT: /usr/local/go
PATH: /home/katexochen/.local/bin:/home/katexochen/.cargo/bin:/home/katexochen/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/usr/local/go/bin:/home/katexochen/go/bin:/usr/local/go/bin:/home/katexochen/go/bin

	go:	/usr/local/go/bin/go: go version go1.17.1 linux/amd64

	gopkgs:	/home/katexochen/go/bin/gopkgs: go1.17.1
		path	github.com/uudashr/gopkgs/v2/cmd/gopkgs
		mod	github.com/uudashr/gopkgs/v2	v2.1.2	h1:A0+QH6wqNRHORJnxmqfeuBEsK4nYQ7pgcOHhqpqcrpo=
		dep	github.com/karrick/godirwalk	v1.12.0	h1:nkS4xxsjiZMvVlazd0mFyiwD4BR9f3m6LXGhM2TUx3Y=
		dep	github.com/pkg/errors	v0.8.1	h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
	
	go-outline:	/home/katexochen/go/bin/go-outline: go1.17.1
		path	github.com/ramya-rao-a/go-outline
		mod	github.com/ramya-rao-a/go-outline	v0.0.0-20210608161538-9736a4bde949	h1:iaD+iVf9xGfajsJp+zYrg9Lrk6gMJ6/hZHO4cYq5D5o=
		dep	golang.org/x/tools	v0.1.1	h1:wGiQel/hW0NnEkJUk8lbzkX2gFJU6PFxf1v5OlCfuOs=
	
	gotests:	/home/katexochen/go/bin/gotests: go1.17.1
		path	github.com/cweill/gotests/gotests
		mod	github.com/cweill/gotests	v1.6.0	h1:KJx+/p4EweijYzqPb4Y/8umDCip1Cv6hEVyOx0mE9W8=
		dep	golang.org/x/tools	v0.0.0-20191109212701-97ad0ed33101	h1:LCmXVkvpQCDj724eX6irUTPCJP5GelFHxqGSWL2D1R0=
	
	gomodifytags:	/home/katexochen/go/bin/gomodifytags: go1.17.1
		path	github.com/fatih/gomodifytags
		mod	github.com/fatih/gomodifytags	v1.16.0	h1:B65npXIXSk44F6c1hZGE1NazSnt+eXvtdEOG2Uy+QdU=
		dep	github.com/fatih/camelcase	v1.0.0	h1:hxNvNX/xYBp0ovncs8WyWZrOrpBNub/JfaMvbURyft8=
		dep	github.com/fatih/structtag	v1.2.0	h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
		dep	golang.org/x/tools	v0.0.0-20180824175216-6c1c5e93cdc1	h1:EAPsk8kfGCjxQagrkWjzXlUWe2p3gj5MknO+z2o9GKc=
	
	impl:	/home/katexochen/go/bin/impl: go1.17.1
		path	github.com/josharian/impl
		mod	github.com/josharian/impl	v1.1.0	h1:gafhg1OFVMq46ifdkBa8wp4hlGogjktjjA5h/2j4+2k=
		dep	golang.org/x/mod	v0.2.0	h1:KU7oHjnv3XNWfa5COkzUifxZmxp1TyI7ImMXqFxLwvQ=
		dep	golang.org/x/tools	v0.0.0-20200522201501-cb1345f3a375	h1:SjQ2+AKWgZLc1xej6WSzL+Dfs5Uyd5xcZH1mGC411IA=
		dep	golang.org/x/xerrors	v0.0.0-20191204190536-9bdfabe68543	h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
	
	goplay:	/home/katexochen/go/bin/goplay: go1.17.1
		path	github.com/haya14busa/goplay/cmd/goplay
		mod	github.com/haya14busa/goplay	v1.0.0	h1:ED4BMrGQ3WH7H3YXrcnWMVzj1xeSepaYTkLh1DtFi/4=
		dep	github.com/skratchdot/open-golang	v0.0.0-20200116055534-eef842397966	h1:JIAuq3EEf9cgbU6AtGPK4CTG3Zf6CKMNqf0MHTggAUA=
	
	dlv:	/home/katexochen/go/bin/dlv: go1.17.1
		path	github.com/go-delve/delve/cmd/dlv
		mod	github.com/go-delve/delve	v1.8.1	h1:X8OujRtMxTzNxM0y3Db+NEafbqEm1r52OydjDHZsrfs=
		dep	github.com/cilium/ebpf	v0.7.0	h1:1k/q3ATgxSXRdrmPfH8d7YK0GfqVsEKZAX9dQZvs56k=
		dep	github.com/cosiner/argv	v0.1.0	h1:BVDiEL32lwHukgJKP87btEPenzrrHUjajs/8yzaqcXg=
		dep	github.com/cpuguy83/go-md2man/v2	v2.0.0	h1:EoUDS0afbrsXAZ9YQ9jdu/mZ2sXgT1/2yyNng4PGlyM=
		dep	github.com/derekparker/trie	v0.0.0-20200317170641-1fdf38b7b0e9	h1:G765iDCq7bP5opdrPkXk+4V3yfkgV9iGFuheWZ/X/zY=
		dep	github.com/google/go-dap	v0.6.0	h1:Y1RHGUtv3R8y6sXq2dtGRMYrFB2hSqyFVws7jucrzX4=
		dep	github.com/hashicorp/golang-lru	v0.5.4	h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
		dep	github.com/mattn/go-isatty	v0.0.3	h1:ns/ykhmWi7G9O+8a448SecJU3nSMBXJfqQkl0upE1jI=
		dep	github.com/mattn/go-runewidth	v0.0.3	h1:a+kO+98RDGEfo6asOGMmpodZq4FNtnGP54yps8BzLR4=
		dep	github.com/peterh/liner	v1.2.2	h1:aJ4AOodmL+JxOZZEL2u9iJf8omNRpqHc/EbrK+3mAXw=
		dep	github.com/russross/blackfriday/v2	v2.0.1	h1:lPqVAte+HuHNfhJ/0LC98ESWRz8afy9tM/0RK8m9o+Q=
		dep	github.com/shurcooL/sanitized_anchor_name	v1.0.0	h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo=
		dep	github.com/sirupsen/logrus	v1.6.0	h1:UBcNElsrwanuuMsnGSlYmtmgbb23qDR5dG+6X6Oo89I=
		dep	github.com/spf13/cobra	v1.1.3	h1:xghbfqPkxzxP3C/f3n5DdpAbdKLj4ZE4BWQI362l53M=
		dep	github.com/spf13/pflag	v1.0.5	h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
		dep	go.starlark.net	v0.0.0-20200821142938-949cc6f4b097	h1:YiRMXXgG+Pg26t1fjq+iAjaauKWMC9cmGFrtOEuwDDg=
		dep	golang.org/x/arch	v0.0.0-20190927153633-4e8777c89be4	h1:QlVATYS7JBoZMVaf+cNjb90WD/beKVHnIxFKT4QaHVI=
		dep	golang.org/x/sys	v0.0.0-20211117180635-dee7805ff2e1	h1:kwrAHlwJ0DUBZwQ238v+Uod/3eZ8B2K5rYsUHBQvzmI=
		dep	gopkg.in/yaml.v2	v2.4.0	h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
	
	staticcheck:	/home/katexochen/go/bin/staticcheck: go1.17.1
		path	honnef.co/go/tools/cmd/staticcheck
		mod	honnef.co/go/tools	v0.2.2	h1:MNh1AVMyVX23VUHE2O27jm6lNj3vjO5DexS4A1xvnzk=
		dep	github.com/BurntSushi/toml	v0.3.1	h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
		dep	golang.org/x/mod	v0.3.0	h1:RM4zey1++hCTbCVQfnWeKs9/IEsaBLA8vTkd0WVtmH4=
		dep	golang.org/x/sys	v0.0.0-20210119212857-b64e53b001e4	h1:myAQVi0cGEoqQVR5POX+8RR2mrocKqNN1hmeMqhX27k=
		dep	golang.org/x/tools	v0.1.0	h1:po9/4sTYwZU9lPhi1tOrb4hCv3qrhiQ77LZfGa2OjwY=
		dep	golang.org/x/xerrors	v0.0.0-20200804184101-5ec99f83aff1	h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
	
	gopls:	/home/katexochen/go/bin/gopls: go1.17.1
		path	golang.org/x/tools/gopls
		mod	golang.org/x/tools/gopls	v0.7.5	h1:8Az52YwcFXTWPvrRomns1C0N+zlgTyyPKWvRazO9GG8=
		dep	github.com/BurntSushi/toml	v0.4.1	h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
		dep	github.com/google/go-cmp	v0.5.6	h1:BKbKCqvP6I+rmFHt06ZmyQtvB8xAkWdhFyr0ZUNZcxQ=
		dep	github.com/sergi/go-diff	v1.1.0	h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0=
		dep	golang.org/x/mod	v0.5.1	h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
		dep	golang.org/x/sync	v0.0.0-20210220032951-036812b2e83c	h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ=
		dep	golang.org/x/sys	v0.0.0-20211019181941-9d821ace8654	h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
		dep	golang.org/x/text	v0.3.7	h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk=
		dep	golang.org/x/tools	v0.1.9-0.20220114220130-fd7798718afd	h1:lTnuArxJC+n54TyvWUPyHhrnGxYvhSi13/aM2Ndr4bs=
		dep	golang.org/x/xerrors	v0.0.0-20200804184101-5ec99f83aff1	h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
		dep	honnef.co/go/tools	v0.2.1	h1:/EPr//+UMMXwMTkXvCCoaJDq8cpjMO80Ou+L4PDo2mY=
		dep	mvdan.cc/gofumpt	v0.1.1	h1:bi/1aS/5W00E2ny5q65w9SnKpWEF/UIOqDYBILpo9rA=
		dep	mvdan.cc/xurls/v2	v2.3.0	h1:59Olnbt67UKpxF1EwVBopJvkSUBmgtb468E4GVWIZ1I=
	

go env
Workspace Folder (vscode-vet): /home/katexochen/katexochen/vscode-vet
	GO111MODULE=""
	GOARCH="amd64"
	GOBIN=""
	GOCACHE="/home/katexochen/.cache/go-build"
	GOENV="/home/katexochen/.config/go/env"
	GOEXE=""
	GOEXPERIMENT=""
	GOFLAGS=""
	GOHOSTARCH="amd64"
	GOHOSTOS="linux"
	GOINSECURE=""
	GOMODCACHE="/home/katexochen/go/pkg/mod"
	GONOPROXY="github.com/edgelesssys"
	GONOSUMDB="github.com/edgelesssys"
	GOOS="linux"
	GOPATH="/home/katexochen/go"
	GOPRIVATE="github.com/edgelesssys"
	GOPROXY="https://proxy.golang.org,direct"
	GOROOT="/usr/local/go"
	GOSUMDB="sum.golang.org"
	GOTMPDIR=""
	GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
	GOVCS=""
	GOVERSION="go1.17.1"
	GCCGO="gccgo"
	AR="ar"
	CC="gcc"
	CXX="g++"
	CGO_ENABLED="1"
	GOMOD="/home/katexochen/katexochen/vscode-vet/go.mod"
	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-build2894027118=/tmp/go-build -gno-record-gcc-switches"
	

Share the Go related settings you have added/edited

Run Preferences: Open Settings (JSON) command to open your settings.json file.
Share all the settings with the go. or ["go"] or gopls prefixes.

  "go.toolsManagement.autoUpdate": true,
  "go.coverageOptions": "showUncoveredCodeOnly",
  "go.testTimeout": "2m",
  "go.testFlags": ["-count=1", "-race", "-v"],
  "go.buildTags": "integration",
  "go.formatTool": "gofumpt",

Describe the bug

Using the language server, I expected to see the same warnings as using go vet manually, but the extension isn't showing the following warning the command line tool detects.

package main

import "google.golang.org/genproto/googleapis/cloud/compute/v1"

func main() {
	_ = GetGlobalSynced()
}

func GetGlobalSynced() compute.InsertInstanceTemplateRequest {
	req := compute.InsertInstanceTemplateRequest{}
	return req
}
$ go vet .
# github.com/katexochen/vscode-vet-problem
./main.go:12:9: return copies lock value: google.golang.org/genproto/googleapis/cloud/compute/v1.InsertInstanceTemplateRequest contains google.golang.org/protobuf/internal/impl.MessageState contains sync.Mutex

However, when I change the function above to the following, the self-assignment is detected correctly by the extension.

func GetGlobalSynced() compute.InsertInstanceTemplateRequest {
	req := compute.InsertInstanceTemplateRequest{}
	req = req // warning: self-assignment of req to req (assign)
	return req
}

Also, if I set the following setting, the "return copies lock value" warning is shown as expected by the extension on save.

  "go.languageServerExperimentalFeatures": { "diagnostics": false }

Full code example under https://github.com/katexochen/vscode-vet-problem

Might be related to golang/vscode-go#1991?

@hyangah
Copy link
Contributor

hyangah commented Feb 22, 2022

Thanks for the concrete repro case!
Transferring to gopls. The copylock analyzer should run by default (and should match go vet).

My guess is that this is another bug stem from AST trimming (like #51016) since the following case shows the warning correctly cc: @findleyr

--- go.mod ---
module work

go 1.17
--- main.go ---
package main

import (
	"work/xxx"
)

func main() {
	_ = GetX()
}

func GetX() xxx.X {
	x := xxx.X{}
	return x // This 
}
--- xxx/s.go ---
package xxx

import "sync"

type X struct {
	sync.Mutex
}

Screen Shot 2022-02-22 at 6 27 18 PM

@hyangah hyangah transferred this issue from golang/vscode-go Feb 22, 2022
@hyangah hyangah changed the title go vet warning not shown/detected by the language server x/tools/gopls: copylock warning not shown/detected by the language server Feb 22, 2022
@gopherbot gopherbot added Tools This label describes issues relating to any tools in the x/tools repository. gopls Issues related to the Go language server, gopls. labels Feb 22, 2022
@gopherbot gopherbot added this to the Unreleased milestone Feb 22, 2022
@guodongli-google
Copy link

I confirmed that the command-line vet will report the issue correctly. So it shall be related to the language server's diagnostics setting.

@findleyr
Copy link
Contributor

findleyr commented Mar 1, 2022

Yes, this is a gopls issue related to pruning of AST outside of the workspace to reduce memory consumption. It is a fundamental issue that we hope to resolve by changing our memory model to allow full AST for non-workspace packages.

So this issue is not directly actionable, but I will keep it open for tracking purposes. Thank you.

@findleyr findleyr modified the milestones: Unreleased, gopls/on-deck Mar 1, 2022
@hyangah hyangah added the gopls/analysis Issues related to running analysis in gopls label May 10, 2022
@adonovan adonovan added the Analysis Issues related to static analysis (vet, x/tools/go/analysis) label Apr 22, 2023
@adonovan
Copy link
Member

The new analysis driver (to be released in v0.12.0) should have fixed this, and indeed it appears to be fixed at tip:

type T struct {
	mu sync.Mutex
}

func _() T {
	var x T
	return x // "return copies lock value"
}

@golang golang locked and limited conversation to collaborators Apr 21, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
Analysis Issues related to static analysis (vet, x/tools/go/analysis) FrozenDueToAge gopls/analysis Issues related to running analysis in gopls gopls Issues related to the Go language server, gopls. Tools This label describes issues relating to any tools in the x/tools repository.
Projects
None yet
Development

No branches or pull requests

6 participants