我正在跟踪第三方代码中的错误,并将其缩小到类似的范围。
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
在稳定的1.38.0上运行,这会打印函数指针,但是beta(1.39.0-beta.6)和夜间返回'1'。(游乐场)
_
推断出什么,为什么行为发生了变化?
我认为正确的方法只是foo as *const c_void
,但这不是我的代码。
这不能完全回答您的问题,但是您可能想要:
—
彼得·霍尔
let ptr = foo as *const fn() as *const c_void;
foo
已经是一个函数指针,因此您不应该使用地址。这将创建一个双重引用,似乎是零大小的类型(因此为magic值1
)。