Estoy rastreando un error en el código de un tercero y lo reduje a algo similar.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Ejecutado en estable 1.38.0 esto imprime el puntero de función, pero beta (1.39.0-beta.6) y nocturno devuelven '1'. ( Área de juegos )
¿A qué se _
infiere y por qué ha cambiado el comportamiento?
Supongo que la forma correcta de emitir esto sería simplemente foo as *const c_void
, pero este no es mi código.
let ptr = foo as *const fn() as *const c_void;
foo
ya es un puntero de función, por lo que no debe tomar una dirección. Eso crea una doble referencia, aparentemente a un tipo de tamaño cero (por lo tanto, el valor mágico1
).