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
zbsbpyhn1#
https://golang.org/cl/170013提到了这个问题:compiler: require nil check when dereferecing a pointer to zero-sized type
compiler: require nil check when dereferecing a pointer to zero-sized type
00jrzges2#
问题似乎不仅限于零大小的类型。
package main func main() { var p *struct{ x int } *p = *p }
这也不会引发恐慌。我认为只要类型不是太大(>4096字节),如果后端以某种方式优化了取消引用,它就不会引发恐慌。
zrfyljdw3#
我认为你是对的。但是我并不特别想为所有的指针解引用强制执行空检查。原则上,只有在我们认为后端可能会消除解引用的情况下,我们才能这样做。
jjhzyzn04#
https://golang.org/cl/176459提到了这个问题:compiler: improve escape analysis on interface conversions
compiler: improve escape analysis on interface conversions
q35jwt9p5#
https://golang.org/cl/176579提到了这个问题:test: use a real use function in nilptr2.go
test: use a real use function in nilptr2.go
5条答案
按热度按时间zbsbpyhn1#
https://golang.org/cl/170013提到了这个问题:
compiler: require nil check when dereferecing a pointer to zero-sized type
00jrzges2#
问题似乎不仅限于零大小的类型。
这也不会引发恐慌。我认为只要类型不是太大(>4096字节),如果后端以某种方式优化了取消引用,它就不会引发恐慌。
zrfyljdw3#
我认为你是对的。但是我并不特别想为所有的指针解引用强制执行空检查。原则上,只有在我们认为后端可能会消除解引用的情况下,我们才能这样做。
jjhzyzn04#
https://golang.org/cl/176459提到了这个问题:
compiler: improve escape analysis on interface conversions
q35jwt9p5#
https://golang.org/cl/176579提到了这个问题:
test: use a real use function in nilptr2.go