【问题标题】:What safety guarantees of Rust would be lost if not for object safety?如果不是为了对象安全,Rust 会失去哪些安全保证?
【发布时间】:2016-07-12 01:10:17
【问题描述】:

我试图理解对象安全的概念。我从文档中知道对象安全性如下:

  • 该特征不需要Self: Sized
  • 它的所有方法都是对象安全的

如果对象安全所需的两个条件之一被删除,哪些事情可能会导致安全 Rust 所做的安全保证失败?

【问题讨论】:

  • 是的......“内部结构使得它无法实际与 trait 对象一起使用。” - 我推断这意味着类型签名可能会得到满足,但可能会与借用检查或生命周期(??)发生冲突 - 所以你不能使用它。这两个条件足以让它实际编译。但它们有必要吗?很高兴看到丢弃任何一个都会给你带来麻烦的例子,以及究竟是什么阻碍。

标签: rust


【解决方案1】:

来自Where Self Meets Sized: Revisiting Object Safety

只有当编译器可以通过存储在 trait 对象中的 vtable 将每个方法实现为动态函数调用来自动实现它时,trait 才是对象安全的。

如果没有对象安全规则,我们可以编写具有由 trait 对象满足的类型签名的函数,但其​​内部结构使其无法实际与 trait 对象一起使用。

我相信“对象安全”的措辞选择回想起来可能是一个糟糕的选择,因为它似乎与 内存安全(该术语的正常使用)没有任何关系Rust 中的“(不)安全”。

对象的“能力”可能更接近真相;可以通过 trait 对象 引用的 trait。

【讨论】:

  • 澄清一下,问题不在于将这些用作特征对象的能力是危险的,而是您无法以这种方式实现它。
  • +1 在这里奇怪地使用了“安全”,问题不在于安全,而在于无法实现虚拟调度。
  • 我认为这里有一个错误的例子会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 2020-12-04
  • 2018-11-23
相关资源
最近更新 更多