Ich habe einen Fehler im Code von Drittanbietern aufgespürt und ihn auf etwas in der Art von eingegrenzt.
use libc::c_void;
pub unsafe fn foo() {}
fn main() {
let ptr = &foo as *const _ as *const c_void;
println!("{:x}", ptr as usize);
}
Bei stabiler Version 1.38.0 wird der Funktionszeiger gedruckt, aber Beta (1.39.0-Beta.6) und nächtliche Rückgabe '1'. ( Spielplatz )
Worauf wird geschlossen _
und warum hat sich das Verhalten geändert?
Ich gehe davon aus, dass der richtige Weg, dies zu übertragen, einfach wäre foo as *const c_void
, aber dies ist nicht mein Code.
let ptr = foo as *const fn() as *const c_void;
foo
ist bereits ein Funktionszeiger, daher sollten Sie ihm keine Adresse geben. Dadurch entsteht eine doppelte Referenz, die scheinbar auf einen Typ mit der Größe Null (also den magischen Wert1
) verweist .