Skip to content

cmd/compile: nil pointer dereference in the 1.18 compiler when dealing with generic types #50423

@pcostanza

Description

@pcostanza

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

$ go version
go version go1.18beta1 darwin/amd64

and

$ go version
go version devel go1.18-95b240b Mon Jan 3 23:45:12 2022 +0000 darwin/amd64

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=""
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/pcostanz/Library/Caches/go-build"
GOENV="/Users/pcostanz/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/pcostanz/go/pkg/mod"
GONOPROXY=/*set but not revealed*/
GONOSUMDB=/*set but not revealed*/
GOOS="darwin"
GOPATH="/Users/pcostanz/go"
GOPRIVATE=/*set but not revealed*/
GOPROXY="https://proxy.golang.org,direct"
GOROOT="/Users/pcostanz/sdk/gotip"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/Users/pcostanz/sdk/gotip/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="devel go1.18-95b240b Mon Jan 3 23:45:12 2022 +0000"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
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 -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/z2/j1tgwrsx2cdcpr780wzjk6tw0000gq/T/go-build154765131=/tmp/go-build -gno-record-gcc-switches -fno-common"

What did you do?

It is very difficult to reproduce the issue. I am currently developing a set of three libraries depending on each other, using generic types in current go 1.18 beta / development versions. (library A depends on B, library B depends on C) The bug occurs when I try to build library A, and it seems to be triggered by an instantiation of a generic function from library B.

The error message I get is the following in go1.18beta1

go1.18beta1 build *.go
# command-line-arguments
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x4 pc=0x17ee660]

goroutine 1 [running]:
cmd/compile/internal/noder.(*genInst).genericSubst(0x1f89a60, 0xc001c22eb0, 0xc000f82270, {0xc000e02798, 0x1, 0x1}, 0x1, 0xc001ac35d8)
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:758 +0x160
cmd/compile/internal/noder.(*genInst).getInstantiation(0x1f89a60, 0xc000f82270, {0xc000e02790, 0x1, 0x1a8ecb8?}, 0x38?)
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:703 +0x39d
cmd/compile/internal/noder.(*genInst).scanForGenCalls.func1({0x1a8d6d8, 0xc001696f30?})
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:176 +0x2df
cmd/compile/internal/ir.Visit.func1({0x1a8d6d8, 0xc001696f30})
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:105 +0x30
cmd/compile/internal/ir.doNodes(...)
	/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1512
cmd/compile/internal/ir.(*AssignListStmt).doChildren(0xc001ab40c0, 0xc001ac35c0)
	/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:100 +0xa9
cmd/compile/internal/ir.DoChildren(...)
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0x1a8d160, 0xc001ab40c0})
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes(...)
	/usr/local/go/src/cmd/compile/internal/ir/node_gen.go:1512
cmd/compile/internal/ir.(*Func).doChildren(0x1a8e038?, 0xc001ac35c0?)
	/usr/local/go/src/cmd/compile/internal/ir/func.go:152 +0x6e
cmd/compile/internal/ir.DoChildren(...)
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0x1a8e038, 0xc0022542c0})
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.Visit({0x1a8e038, 0xc0022542c0}, 0xc001c04f00)
	/usr/local/go/src/cmd/compile/internal/ir/visit.go:108 +0xb8
cmd/compile/internal/noder.(*genInst).scanForGenCalls(0x1f89a60, {0x1a8e038, 0xc0022542c0})
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:158 +0x1f0
cmd/compile/internal/noder.(*genInst).buildInstantiations(0x1f89a60, 0x1)
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:73 +0x85
cmd/compile/internal/noder.BuildInstantiations(...)
	/usr/local/go/src/cmd/compile/internal/noder/stencil.go:47
cmd/compile/internal/noder.(*irgen).generate(0xc000174240, {0xc000433b80, 0xa, 0x203000?})
	/usr/local/go/src/cmd/compile/internal/noder/irgen.go:320 +0x3db
cmd/compile/internal/noder.check2({0xc000433b80, 0xa, 0xa})
	/usr/local/go/src/cmd/compile/internal/noder/irgen.go:92 +0x16d
cmd/compile/internal/noder.LoadPackage({0xc000128110, 0xa, 0x0?})
	/usr/local/go/src/cmd/compile/internal/noder/noder.go:90 +0x335
cmd/compile/internal/gc.Main(0x1946fe8)
	/usr/local/go/src/cmd/compile/internal/gc/main.go:191 +0xb13
main.main()
	/usr/local/go/src/cmd/compile/main.go:55 +0xdd

I get the following with the gotip version:

gotip build *.go
# command-line-arguments
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x4 pc=0x17ef320]

goroutine 1 [running]:
cmd/compile/internal/noder.(*genInst).genericSubst(0x1f8daa0, 0xc0023a66e0, 0xc0021f6820, {0xc0023a4478, 0x1, 0x1}, 0x1, 0xc00239f9b0)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:758 +0x160
cmd/compile/internal/noder.(*genInst).getInstantiation(0x1f8daa0, 0xc0021f6820, {0xc0023a4470, 0x1, 0x1a90018?}, 0x98?)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:703 +0x39d
cmd/compile/internal/noder.(*genInst).scanForGenCalls.func1({0x1a8ea38, 0xc00222a360?})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:176 +0x2df
cmd/compile/internal/ir.Visit.func1({0x1a8ea38, 0xc00222a360})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:105 +0x30
cmd/compile/internal/ir.doNodes(...)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/node_gen.go:1512
cmd/compile/internal/ir.(*AssignListStmt).doChildren(0xc0022264e0, 0xc00239f998)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/node_gen.go:100 +0xa9
cmd/compile/internal/ir.DoChildren(...)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0x1a8e4c0, 0xc0022264e0})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.doNodes(...)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/node_gen.go:1512
cmd/compile/internal/ir.(*Func).doChildren(0x1a8f398?, 0xc00239f998?)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/func.go:152 +0x6e
cmd/compile/internal/ir.DoChildren(...)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:94
cmd/compile/internal/ir.Visit.func1({0x1a8f398, 0xc00221adc0})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:106 +0x57
cmd/compile/internal/ir.Visit({0x1a8f398, 0xc00221adc0}, 0xc0023aa040)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/ir/visit.go:108 +0xb8
cmd/compile/internal/noder.(*genInst).scanForGenCalls(0x1f8daa0, {0x1a8f398, 0xc00221adc0})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:158 +0x1f0
cmd/compile/internal/noder.(*genInst).buildInstantiations(0x1f8daa0, 0x1)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:73 +0x85
cmd/compile/internal/noder.BuildInstantiations(...)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/stencil.go:47
cmd/compile/internal/noder.(*irgen).generate(0xc00014c240, {0xc000403bd0, 0xa, 0x203000?})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/irgen.go:320 +0x3db
cmd/compile/internal/noder.check2({0xc000403bd0, 0xa, 0xa})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/irgen.go:92 +0x16d
cmd/compile/internal/noder.LoadPackage({0xc000003950, 0xa, 0x0?})
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/noder/noder.go:90 +0x335
cmd/compile/internal/gc.Main(0x1948090)
	/Users/pcostanz/sdk/gotip/src/cmd/compile/internal/gc/main.go:191 +0xb13
main.main()
	/Users/pcostanz/sdk/gotip/src/cmd/compile/main.go:55 +0xdd

I have tried several times to create a small example that triggers the same bug, but I haven't yet managed to do so.

What did you expect to see?

I believe the source code to be correct. go1.18beta1 vet *.go and gotip vet *.go don't report any issues.

What did you see instead?

See above.

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.

    Type

    No type

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions