rust 为什么Pin::map_unchecked不安全?

bnlyeluc  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(151)
pub unsafe fn map_unchecked<U, F>(self, func: F) -> Pin<&'a U>
where
    F: FnOnce(&T) -> &U,
    U: ?Sized,

FnOnce(&T) -> &U params是一个引用,所以它无论如何都不能移动T。为什么这个函数是unsafe
有一个同样的问题here,但不能理解这个例子:

p8ekf7hl

p8ekf7hl1#

Rust标准库中几乎所有的unsafe函数都有解释原因的文档。从Pin::map_unchecked的文档中:
通过Map内部值来构造新接点。
例如,如果你想获取某个字段的Pin,你可以使用它在一行代码中访问该字段。然而,这些“固定投影”有几个陷阱;请参阅pin模块文档以了解有关该主题的更多详细信息。

安全

此功能不安全。你必须保证你返回的数据不会移动,只要参数值不移动(例如,因为它是该值的字段之一),并且你不会从你接收的参数中移出到内部函数。
这与Pin::new_unchecked不安全的原因基本相同。固定一个值意味着它必须 * 永远不会再次移动 *,而不仅仅是在Pin保护的情况下。但是,仅此功能无法确保该保证,必须由使用它的开发人员提供。
所链接的pin模块包括许多 * 结构固定 * 必须遵循的要求,即如果从Pin<&Self>获取一个字段需要该字段也被固定,这是使用map_unchecked的主要原因。要求包括:你不能给予&mut在其他地方访问它,它不能从甚至在Drop实现中被移动,它不能被释放,除非它被丢弃,等等。

相关问题