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)
}

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/14da5c55-9137-46bc-90e1-b51b8ef6553bn%40googlegroups.com.

Reply via email to