Skip to content

x/tools/cmd/gopls: nil pointer dereference when creating new file #34366

Closed
@myitcv

Description

@myitcv

What version of Go are you using (go version)?

$ go version
go version devel +c3c53661ba Tue Sep 17 04:37:46 2019 +0000 linux/amd64
$ go list -m golang.org/x/tools
golang.org/x/tools v0.0.0-20190917215024-905c8ffbfa41
$ go list -m golang.org/x/tools/gopls
golang.org/x/tools/gopls v0.0.0-20190917215024-905c8ffbfa41

Does this issue reproduce with the latest release?

Yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/myitcv/.cache/go-build"
GOENV="/home/myitcv/.config/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GONOPROXY=""
GONOSUMDB=""
GOOS="linux"
GOPATH="/home/myitcv/gostuff"
GOPRIVATE=""
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/home/myitcv/gos"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/home/myitcv/gos/pkg/tool/linux_amd64"
GCCGO="gccgo"
AR="ar"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD="/home/myitcv/gostuff/src/github.com/myitcv/govim/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-build291981782=/tmp/go-build -gno-record-gcc-switches"

What did you do?

Discovered by govim cron tests against gopls and x/tools master.

Creating a new file in a package appears to result in one of two panics due to nil pointer dereferences:

Stack trace 1

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xc57dc5]

goroutine 72 [running]:
golang.org/x/tools/internal/lsp/cache.(*importer).cachePerFile(0xc0004341e0, 0xf547e0, 0xc0004221e0, 0xc0000ef290, 0xf54a20, 0xc000419fe0, 0xc00041c440, 0x0, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/cache/check.go:354 +0x205
golang.org/x/tools/internal/lsp/cache.(*importer).cachePackage(0xc0004341e0, 0xf547e0, 0xc0004221e0, 0xc00041c440, 0xc00041c440, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/cache/check.go:333 +0x1d6
golang.org/x/tools/internal/lsp/cache.(*view).loadParseTypecheck(0xc0002cc000, 0xf547e0, 0xc0004221e0, 0xc0000ef290, 0xf549e0, 0xc0003b9360, 0x0, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/cache/load.go:42 +0x620
golang.org/x/tools/internal/lsp/cache.(*goFile).CheckPackageHandles(0xc0000ef290, 0xf547e0, 0xc0004220f0, 0x0, 0x0, 0x0, 0x0, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/cache/gofile.go:45 +0x665
golang.org/x/tools/internal/lsp/source.Diagnostics(0xf547e0, 0xc0004220f0, 0xf60000, 0xc0002cc000, 0xf57160, 0xc0000ef290, 0x0, 0x0, 0x0, 0x0, ...)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/source/diagnostics.go:71 +0x201
golang.org/x/tools/internal/lsp.(*Server).diagnostics(0xc0001f1aa0, 0xf60000, 0xc0002cc000, 0xc00026be50, 0x4a, 0x0, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/diagnostics.go:36 +0x345
created by golang.org/x/tools/internal/lsp.(*Server).didOpen
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/text_synchronization.go:34 +0x28d

Stack trace 2

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x8 pc=0x7a2e2f]

goroutine 30 [running]:
go/ast.(*File).Pos(...)
	/home/myitcv/gos/src/go/ast/ast.go:990
golang.org/x/tools/internal/lsp/source.IsGenerated(0xbf0ca0, 0xc0003781c0, 0xbfbce0, 0xc0002d6000, 0xc00042a1e0, 0x45, 0x2)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/source/util.go:99 +0x1ef
golang.org/x/tools/internal/lsp.(*Server).didChange(0xc000230120, 0xbf0ca0, 0xc0003781c0, 0xc000210750, 0x0, 0xc00029a160)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/text_synchronization.go:74 +0x2f7
golang.org/x/tools/internal/lsp.(*Server).DidChange(0xc000230120, 0xbf0ca0, 0xc0003781c0, 0xc000210750, 0xc000210750, 0x0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/server.go:138 +0x49
golang.org/x/tools/internal/lsp/protocol.serverHandler.Deliver(0xc02a80, 0xc000230120, 0xbf0ca0, 0xc0003781c0, 0xc000378280, 0xc0004ce700, 0xc000300001)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/lsp/protocol/tsserver.go:123 +0x2780
golang.org/x/tools/internal/jsonrpc2.(*Conn).Run.func1(0xc0001a8660, 0xc000378280, 0xc000230180, 0xbf0ca0, 0xc0003781c0, 0x0, 0x0, 0xc00006e1a0)
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/jsonrpc2/jsonrpc2.go:370 +0x170
created by golang.org/x/tools/internal/jsonrpc2.(*Conn).Run
	/home/myitcv/gostuff/pkg/mod/golang.org/x/tools@v0.0.0-20190917215024-905c8ffbfa41/internal/jsonrpc2/jsonrpc2.go:354 +0x867

What did you expect to see?

No panic.

What did you see instead?

Per above.


cc @stamblerre @ianthehat @muirrn

Activity

added
NeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.
goplsIssues related to the Go language server, gopls.
on Sep 18, 2019
added this to the Unreleased milestone on Sep 18, 2019
added
ToolsThis label describes issues relating to any tools in the x/tools repository.
on Sep 18, 2019
myitcv

myitcv commented on Sep 18, 2019

@myitcv
MemberAuthor

In the govim tests, we only see stack trace 1 when running with -race (for both the tests and gopls). We have not yet seen stack trace 1 in the govim tests.

Stack trace 2 can be triggered by hand when creating a new file in a package and then editing the file. On the first change to the new file the panic is triggered.

gopherbot

gopherbot commented on Sep 18, 2019

@gopherbot
Contributor

Change https://golang.org/cl/196142 mentions this issue: internal/lsp: ensure that an AST cannot be nil without an error

added a commit that references this issue on Sep 19, 2019
e526cda
locked and limited conversation to collaborators on Sep 17, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    FrozenDueToAgeNeedsInvestigationSomeone must examine and confirm this is a valid issue and not a duplicate of an existing one.ToolsThis label describes issues relating to any tools in the x/tools repository.goplsIssues related to the Go language server, gopls.

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @myitcv@gopherbot

        Issue actions

          x/tools/cmd/gopls: nil pointer dereference when creating new file · Issue #34366 · golang/go