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
5条答案
按热度按时间kt06eoxx1#
我认为这是#34684的第一季度。
rhfm7lfc2#
此外,
runtime.KeepAlive
仅保证实际指针仍然有效。它不保证uintptr
转换保持有效。调用Proc.Call
可能需要增长堆栈,这可能会使指向堆栈内存的指针无效。bkhjykvo3#
是的,这个可以作为#34684的重复关闭。
但我不确定那个bug的状态。它听起来像是{Lazy,}Proc.Call今天并不安全使用,至少对于涉及指针的参数来说。
我们是否应该在等待#34684发生一些事情的同时,在文档中澄清这一点?
h7appiyu4#
直接调用{Lazy,}Proc.Call应该是可以的,至少从b3bd7ab(首次包含在Go 1.14中)开始。
无论如何,我很高兴文档得到了澄清。
k4emjkb15#
啊!我刚刚错过了那个文件中的
//go:uintptrescapes
行。好的,这让我感觉好多了。我会发送一些文档,谢谢!