go x/sys/windows:澄清Proc.Call和LazyProc.Call的安全性

jc3wubiy  于 6个月前  发布在  Go
关注(0)|答案(5)|浏览(59)

https://godoc.org/golang.org/x/sys/windows#LazyProc.Call 和 https://godoc.org/golang.org/x/sys/windows#Proc.Call 是 syscall.SysCall 的 Package 器,但需要一堆 uintptrs。
我假设这些 Package 器没有被 https://golang.org/pkg/unsafe/#Pointer 中的 uintptr(unsafe.Pointer)转换异常号(4)覆盖,对吗?
我们可以在 x/sys/windows 中记录这一点吗?
我假设许多调用者都需要 runtime.KeepAlive?
/cc @ianlancetaylor@mdempsky@alexbrainman@josharian@crawshaw

kt06eoxx

kt06eoxx1#

我认为这是#34684的第一季度。

rhfm7lfc

rhfm7lfc2#

此外,runtime.KeepAlive仅保证实际指针仍然有效。它不保证uintptr转换保持有效。调用Proc.Call可能需要增长堆栈,这可能会使指向堆栈内存的指针无效。

bkhjykvo

bkhjykvo3#

是的,这个可以作为#34684的重复关闭。
但我不确定那个bug的状态。它听起来像是{Lazy,}Proc.Call今天并不安全使用,至少对于涉及指针的参数来说。
我们是否应该在等待#34684发生一些事情的同时,在文档中澄清这一点?

h7appiyu

h7appiyu4#

直接调用{Lazy,}Proc.Call应该是可以的,至少从b3bd7ab(首次包含在Go 1.14中)开始。
无论如何,我很高兴文档得到了澄清。

k4emjkb1

k4emjkb15#

啊!我刚刚错过了那个文件中的//go:uintptrescapes行。好的,这让我感觉好多了。
我会发送一些文档,谢谢!

相关问题