I want to create a C FFI API for my crate, but it's not clear how safe it is to cast pointers. Pseudocode:
#[no_mangle]
extern "C" fn f(...) -> *mut c_void {
let t: Box<T> = ...;
let p = Box::into_raw(t);
p as *mut c_void
}
This works as expected, but how safe is it? In C or C++, there is special void *
pointer and the C++ standard declares that it is safe to cast to it. Potentially, sizeof(void *)
may be not equal sizeof(T *)
, but there is a guarantee that sizeof(void *)
>= sizeof(T *)
.
What about Rust? Is there any guarantee about the std::mem::size_of
of a pointer or safe casting between pointers? Or do all pointers have equal size by implementation, equal to usize
?
By "universal", I mean that you can convert X *
without losing anything. I do not care about type information; I care about different sizes of pointers to different things, like near
/far
pointers in the 16-bit days.
4.10 says
The result of converting a "pointer to cv T" to a "pointer to cv void" points to the start of the storage location where the object of type T resides,
It is impossible that sizeof(void *) < sizeof(T *)
, because then it is impossible to have real address of storage location.