将mem::uninitialized替换为MaybeUninit



我正在围绕需要使用文件系统的嵌入式系统进行一个项目。我想在rust中使用liitlefs板条箱,但它使用了自1.39.0以来不推荐使用的mem::uninitialized。https://github.com/brandonedens/rust-littlefs

pub struct LittleFs<T: Storage> {
storage: T,
lfs_config: lfs::lfs_config,
lfs: lfs::lfs_t,
read_buffer: [u8; READ_SIZE],
prog_buffer: [u8; PROG_SIZE],
lookahead_buffer: [u8; LOOKAHEAD / 8],
}
impl<T: Storage> LittleFs<T> {
/// Create a new instance of the LittleFS.
pub fn new(storage: T) -> Self {
LittleFs {
storage: storage,
lfs: unsafe { mem::uninitialized::<lfs::lfs>() },
lfs_config: unsafe { mem::uninitialized::<lfs::lfs_config>() },
read_buffer: [0u8; READ_SIZE],
prog_buffer: [0u8; PROG_SIZE],
lookahead_buffer: [0u8; LOOKAHEAD / 8],
}
}

我试图用以下方式替换它,但它引起了系统的未指明行为:

pub struct LittleFs<T: Storage> {
storage: T,
lfs_config: lfs::lfs_config,
lfs: lfs::lfs_t,
read_buffer: [u8; READ_SIZE],
prog_buffer: [u8; PROG_SIZE],
lookahead_buffer: [u8; LOOKAHEAD / 8],
}
impl<T: Storage> LittleFs<T> {
pub fn new(storage: T) -> Self {
LittleFs {
storage,
lfs: unsafe { MaybeUninit::uninit().assume_init() },
lfs_config: unsafe { MaybeUninit::uninit().assume_init() },
read_buffer: [0u8; READ_SIZE],
prog_buffer: [0u8; PROG_SIZE],
lookahead_buffer: [0u8; LOOKAHEAD / 8],
}
}

有人能解决这个问题吗?提前谢谢。

您不能执行uninit().assume_init()——它肯定不是初始化的。CCD_ 2仅在数据已经用实值初始化之后才被调用。这背后的想法是,你有希望,";是的,我知道这个值被标记为可能已初始化。我保证它现在已经初始化。这不仅仅是一个也许">

您需要更改lfslfs_config:的类型

lfs_config: MaybeUninit<lfs::lfs_config>,
lfs: MaybeUninit<lfs::lfs_t>,

这将在下游产生连锁反应,要求您修改访问字段的任何代码。

  • 使用write初始化它们
  • assume_init_refassume_init_mut阅读

最新更新