Śledzę błąd w kodzie strony trzeciej i zawęziłem go do czegoś podobnego do.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Działa na stabilnej wersji 1.38.0, wypisuje wskaźnik funkcji, ale beta (1.39.0-beta.6) i nocne zwrócenie „1”. ( Plac zabaw )
Jakie są _
wnioski i dlaczego zachowanie się zmieniło?
Zakładam, że właściwy sposób na przesłanie tego byłoby po prostu foo as *const c_void
, ale to nie jest mój kod.
let ptr = foo as *const fn() as *const c_void;
foo
jest już wskaźnikiem funkcji, więc nie powinieneś do niego adresować. To tworzy podwójne odniesienie, pozornie do typu zerowego (a więc magicznej wartości1
).