首页 > 解决方案 > 在golang 1.17中使用原子交换指针更改指针接收器的值是否安全

问题描述

golang 1.17 从堆栈更改为注册以处理参数

当我使用 atomic.SwapPointer 更改指针接收器的值时是否安全

下面是代码

//like this
func (this *A) Replace(a *A) {
    //other business logic
    //....
    //business logic end
    atomic.SwapPointer((*unsafe.Pointer)(unsafe.Pointer(&this)), unsafe.Pointer(a))
}

标签: goatomicswapreceiver

解决方案


我不认为这是在做你想做的事。从 Go 代码的角度来看,即使是“明智的”不安全代码,您也无法区分寄存器和堆栈 ABI。如果您获取参数的地址,如果它还没有在内存中,它将被存储到内存中,这将是它的地址。如果将该地址传递给一个函数,该函数通过将地址存储在全局或堆中来“转义”地址,那么参数的内存实际上将通过为它分配一个槽并将其存储在那里来获得。如果发生这种情况,随后对该参数的引用将通过隐藏指针间接指向其堆地址。


推荐阅读