gccgo: 对空指针的零宽度类型解引用不会导致恐慌,

5lhxktic  于 5个月前  发布在  Go
关注(0)|答案(5)|浏览(54)

Go规范说明:"对于指针类型T的操作数x,指针间接访问x表示由x指向的类型为T的变量。如果x为nil,尝试评估*x将导致运行时恐慌。"
这个程序在使用cmd/compile编译时会正确地引发恐慌,但在使用gccgo 8.0.0时不会:

package main

func main() {
	var p *struct{}
	*p = *p
}

/cc @ianlancetaylor

zbsbpyhn

zbsbpyhn1#

https://golang.org/cl/170013提到了这个问题:compiler: require nil check when dereferecing a pointer to zero-sized type

00jrzges

00jrzges2#

问题似乎不仅限于零大小的类型。

package main

func main() {
	var p *struct{ x int }
	*p = *p
}

这也不会引发恐慌。我认为只要类型不是太大(>4096字节),如果后端以某种方式优化了取消引用,它就不会引发恐慌。

zrfyljdw

zrfyljdw3#

我认为你是对的。但是我并不特别想为所有的指针解引用强制执行空检查。原则上,只有在我们认为后端可能会消除解引用的情况下,我们才能这样做。

jjhzyzn0

jjhzyzn04#

https://golang.org/cl/176459提到了这个问题:compiler: improve escape analysis on interface conversions

q35jwt9p

q35jwt9p5#

https://golang.org/cl/176579提到了这个问题:test: use a real use function in nilptr2.go

相关问题