Я отслеживаю ошибку в стороннем коде и сузил ее до чего-то вроде.
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 выводится указатель на функцию, но бета (1.39.0-бета.6) и ночной возврат '1'. ( Детская площадка )
На что делается _
вывод и почему изменилось поведение?
Я предполагаю, что правильный способ разыграть это будет просто foo as *const c_void
, но это не мой код.
let ptr = foo as *const fn() as *const c_void;
foo
это уже указатель на функцию, поэтому вы не должны принимать к нему адрес. Это создает двойную ссылку, по-видимому, на тип нулевого размера (таким образом, магическое значение1
).