能否通过C FFI读取未初始化字节/结构体填充字节?
我的推理过程
- 可将任意结构体转换为
[MaybeUninit<u8>; size_of_struct],其中包含填充字节 - 可将未初始化的缓冲区传递给C函数完成初始化
- 和Rust不同,在C中可通过直接将字节视为已初始化的方式来“初始化”字节(据我了解)
use core::mem::MaybeUninit; extern "C" { // 定义在C源文件中: // void *identity(void *p) { return p; } fn identity(p: *const MaybeUninit<u8>) -> *const u8; } pub fn convert_to_bytes_including_padding<T>(x: *const T) -> *const [u8] { let x_maybe_uninit_bytes = x as *const MaybeUninit<u8>; unsafe { let x_bytes = identity(x_maybe_uninit_bytes); core::slice::from_raw_parts(x_bytes, core::mem::size_of::<T>()) } }
补充说明
基于讨论,这个问题可部分简化为:如果Rust代码从外部C函数(例如malloc)接收u8缓冲区,若该C函数无法保证初始化所有字节,将缓冲区类型指定为*const u8是否会直接触发未定义行为,例如以下代码是否不安全(注意c_void是#[repr(u8)])。我可能会将此作为单独问题提出。
fn get_arbitrary_bytes(n: usize) -> *const u8 { let x: *const c_void = unsafe { libc::malloc(n) }; x as *const u8 }
内容的提问来源于stack exchange,提问作者ajp
相关产品推荐
相关产品推荐

