Again, the rules <https://golang.org/pkg/unsafe/#Pointer> are very clear and in accordance with what's been said here (both by OP and by you):
(5) Conversion of the result of reflect.Value.Pointer or > reflect.Value.UnsafeAddr from uintptr to Pointer. Package reflect's Value methods named Pointer and UnsafeAddr return type > uintptr instead of unsafe.Pointer to keep callers from changing the result > to an arbitrary type without first importing "unsafe". However, this means > that the result is fragile and must be converted to Pointer immediately > after making the call, in the same expression: p := (*int)(unsafe.Pointer(reflect.ValueOf(new(int)).Pointer())) > As in the cases above, it is invalid to store the result before the > conversion: > // INVALID: uintptr cannot be stored in variable // before conversion back to Pointer. > u := reflect.ValueOf(new(int)).Pointer() > p := (*int)(unsafe.Pointer(u)) The rules specifically call out one as safe and the other as invalid. On Sun, Apr 18, 2021 at 9:18 PM Cuong Manh Le <cuong.manhle...@gmail.com> wrote: > What's your platform? > > On M1, checkptr reports an error for me. The code: > > ptr := unsafe.Pointer(rf.UnsafeAddr()) > > > is safe, but: > > x := rf.UnsafeAddr() > ptr = unsafe.Pointer(x) > > > is not. > > Cuong Manh Le > https://cuonglm.xyz > > > On Sun, Apr 18, 2021 at 6:46 AM Name No <zylthink...@gmail.com> wrote: > >> >> 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 golang-nuts+unsubscr...@googlegroups.com. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/golang-nuts/14da5c55-9137-46bc-90e1-b51b8ef6553bn%40googlegroups.com >> <https://groups.google.com/d/msgid/golang-nuts/14da5c55-9137-46bc-90e1-b51b8ef6553bn%40googlegroups.com?utm_medium=email&utm_source=footer> >> . >> > -- > 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 golang-nuts+unsubscr...@googlegroups.com. > To view this discussion on the web visit > https://groups.google.com/d/msgid/golang-nuts/CALS7p_eYX2_n0QFKJQFX9xVopRAKoMggQCZxhoD9AjeKrFEMXw%40mail.gmail.com > <https://groups.google.com/d/msgid/golang-nuts/CALS7p_eYX2_n0QFKJQFX9xVopRAKoMggQCZxhoD9AjeKrFEMXw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > -- 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 golang-nuts+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/golang-nuts/CAEkBMfFgAJfhz4wQoAiooWZKuS9i6yFfcyrPpCCsKtq9%2BkGwCQ%40mail.gmail.com.