reflect.Value.UnsafeAddr has the commence attached like that:
//go:nocheckptr
// This prevents inlining Value.UnsafeAddr when -d=checkptr is enabled,
// which ensures cmd/compile can recognize unsafe.Pointer(v.UnsafeAddr())
// and make an exception.
Seems it is saying unsafe.Pointer(reflect.Value.UnsafeAddr()) is dangerous that go:nocheckptr can disable UnsafeAddr from inline, so cmd/compile can detect it is a function call and raise an exception.
But indeed, the following code will not raise any exception at ptr := unsafe.Pointer(rf.UnsafeAddr()).
It indicates that unsafe.Pointer(rf.UnsafeAddr()) is safe.
Anybody can help to explain this?
go run -race -gcflags=all=-d=checkptr c.go
package main
import (
"reflect"
"unsafe"
"fmt"
)
func main() {
var s = struct{ foo int }{100}
rs := reflect.ValueOf(&s).Elem()
rf := rs.Field(0)
ptr := unsafe.Pointer(rf.UnsafeAddr())
x := rf.UnsafeAddr()
ptr = unsafe.Pointer(x)
fmt.Println(ptr)
}