You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 13:40:03