变形(Transmutes)

源:transmutes.md   Commit: 0e6c680ebd72f1860e46b2bd40e2a387ad8084ad

类型系统你给我滚开!我要自己解析这些字节,不成功便成仁!虽然本书都是关于非安全的内容,我还是希望你能仔细考虑避免使用本章讲到的内容。这是你在Rust中所能做到的真真正正、彻彻底底、最最可怕的非安全行为。所有的保护机制都形同虚设。

mem::transmute<T, U>接受一个T类型的值,然后将它重新解析为类型U。唯一的限制是TU必须有同样的大小。可能产生未定义行为的情况让人看着头疼。

  • 最重要的,创建任一类型的处于不合法状态的示例,都将产生不可预知的混乱
  • transmute有一个重载的返回类型。如果没有明确指定返回类型,它会返回一个满足类型推断的奇怪类型
  • 使用不合法的值构建基本类型是未定义行为
  • 非repr(C)的类型之间相互变形是未定义行为
  • &变形为&mut是未定义行为
    • &变形为&mut永远都是未定义行为
    • 不要多想,你绝对不能这么做
    • 不要多想,你没有什么特殊的
  • 变形为一个未指定生命周期的引用会产生无界生命周期

mem::transmute_copy<T, U>很神奇地比这更加不安全。它从&T拷贝size_of<U>个字节并将它们解析为Umem::transmute仅有的类型大小的检查都不见了(因为拷贝类型前缀有可能是合法的),只不过U的尺寸比T大会被视为一个未定义行为。

当然,本章大部分的功能都可以通过指针的显式转换实现。