rust - 这个 mem::transmute::<&str, &'static str>(k) 安全吗?

标签 rust

我正在查看 this code这是一个非常简单的库,只有一个文件,主要是测试,所以它很短。我试图理解一个结构:

pub struct ChallengeFields(HashMap<UniCase<CowStr>, (String, Quote)>);

struct CowStr(Cow<'static, str>);

在它做的地方有一条线

pub fn get(&self, k: &str) -> Option<&String> {
    self.0
        .get(&UniCase(CowStr(Cow::Borrowed(unsafe {
            mem::transmute::<&str, &'static str>(k)
        }))))
        .map(|&(ref s, _)| s)
}

我对这个不安全 操作感到恼火。我认为 CowStr 是一头 Cow 具有 'static 生命周期,否则很难或不可能存储 str map 里面。因此,当我尝试在此 map 中获取某些内容时,相关的 str 必须具有 'static 生命周期。这就是 transmute 的原因,对吧?如果是这样,为什么不使用 String,这样我们就可以摆脱生命周期,从而实现 transmute?我不喜欢 unsafe,并且阅读有关 transmute 的内容看起来很不安全。

此外,我根本不明白为什么需要 Cow

最佳答案

I think CowStr is a Cow with 'static lifetime otherwise it'd be hard or impossible to store strs inside the map.

是也不是,你可以将 &'static str 存储在 HashMap 中没有问题,问题是你不能存储两者 & 'static strString

Am I rigth? If so, why simply not use String, so we can get rid of lifetimes and thus transmute?

我认为这是一种优化:使用 String 时,每次您想在 map 中插入挑战时都必须创建一个分配,但如果绝大多数挑战名称是 DigestBasic 那么这是浪费时间(和内存,但主要是时间),但同时你必须支持 String自定义身份验证方案。

现在也许在宏伟的计划中,这并不是真正重要的优化,最好不要这样做,我不能告诉你。

I don't like unsafe, and reading about transmute it looks very unsafe.

这是一件值得商榷的事情,但在这种情况下它是“安全的”,因为引用对于整个 HashMap::get 调用都是有效的,我们知道那个调用不会使引用保持事件状态(它依赖于有点冒险的实现细节,但改变的可能性基本上为零,因为它没有多大意义)。

延长生命周期本身并不是 UB(mem::transmute 文档确实提供了这样做的示例),但需要小心,因为您必须避免它导致 UB(最可能是悬空引用)。

关于rust - 这个 mem::transmute::<&str, &'static str>(k) 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67155726/

相关文章:

rust - 为什么标准库不在没有 cloned() 的情况下在元组数组的迭代器上实现 collect?

multithreading - “lock”应用程序的UI线程是什么意思?

json - Rust & Serde JSON 反序列化示例?

struct - 我如何声明我想要一个包含对实现特征的东西的引用的结构?

rust - YAML枚举对象表示

rust - crypto::hmac::Hmac::new 中的参数类型不匹配

string - 遍历一个字符串,一次 n 个元素

rust - 作为 1 字节位掩码的 bool 结构

postgresql - 如何使用柴油进行 IN 查询?

rust - 我应该如何重组图形代码以避免出现 "Cannot borrow variable as mutable more than once at a time"错误?