golang / go

The Go programming language
https://go.dev
BSD 3-Clause "New" or "Revised" License
124k stars 17.67k forks source link

cmd/compile: crash in type loop detection since CL 258177 #42075

Closed mvdan closed 4 years ago

mvdan commented 4 years ago
$ cat crash.go
package hamt

type T1 struct {
    x int
    f T2
}

type T2 struct {
    f T1
}
$ go1 version
go version go1.15.3 linux/amd64
$ go1 build crash.go
# command-line-arguments
./crash.go:8:6: invalid recursive type T2
$ go version
go version devel +c8f6135d4f Sat Oct 17 07:18:20 2020 +0000 linux/amd64
$ go build crash.go
# command-line-arguments
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0xa139b2]

goroutine 1 [running]:
cmd/compile/internal/gc.findTypeLoop(0xc0003a86c0, 0xc00010e850, 0xc000052ab0)
    /home/mvdan/tip/src/cmd/compile/internal/gc/align.go:202 +0xd2
cmd/compile/internal/gc.findTypeLoop(0xc0003e3500, 0xc00010e850, 0x1)
    /home/mvdan/tip/src/cmd/compile/internal/gc/align.go:216 +0x2b9
cmd/compile/internal/gc.findTypeLoop(0xc0003e34a0, 0xc00010e850, 0xc00000e3f8)
    /home/mvdan/tip/src/cmd/compile/internal/gc/align.go:202 +0xe7
cmd/compile/internal/gc.findTypeLoop(0xc0003e35c0, 0xc00010e850, 0x0)
    /home/mvdan/tip/src/cmd/compile/internal/gc/align.go:216 +0x2b9
[...]

Note that the crash does not happen if I remove x int. This is a minified version of a real crash I encountered while generating Go code with type loops (by mistake).

I tried to figure out a quick fix, but couldn't really. cc @mdempsky @cuonglm

cagedmantis commented 4 years ago

/cc @randall77 @griesemer

gopherbot commented 4 years ago

Change https://golang.org/cl/263717 mentions this issue: cmd/compile: fix reporting of invalid recursive types