Rust 的最差特性* —  - amina86.com

主要观点:

  • 介绍了 Rust 中core::io::BorrowedBuf,它是一个夜间特性,存在诸多问题。
  • slow_copy函数为例说明零初始化缓冲区的问题及MaybeUninit的解决方案,但该代码不安全。
  • 详细阐述了BorrowedBuf的使用及存在的问题,如与现有代码的整合性、通用性、易误用性和复杂性等。
  • 探讨了人们希望的未初始化内存的语义及相关实现的困难,如slice_freeze_mut函数避免MADV_FREE导致的问题及优化困难。

关键信息:

  • core::io::BorrowedBuf是夜间特性,存在诸多问题,如与现有代码整合困难、通用性受限、易误用、结构复杂等。
  • slow_copy函数中零初始化缓冲区浪费时间,MaybeUninit可解决但代码不安全。
  • 人们希望未初始化内存存储任意数据,需冻结后安全读取,但实现困难,如slice_freeze_mut函数避免MADV_FREE导致的问题需页触摸。

重要细节:

  • slow_copy函数中每次循环都零初始化缓冲区,即使read会覆盖数据,编译器也无法优化。
  • BorrowedBuf不拥有内存,可指向栈上数组或堆上切片,但其read_buf方法可选,许多第三方Read实现不提供该方法。
  • rand crate 的RngCore::fill_bytes方法可受益于写入未初始化内存,但需支持BorrowedBuf,否则需修改代码或使用fork
  • BorrowedBuf结构复杂,需分别存储已填充和已初始化部分信息,以避免重复初始化内存。
  • 读取未初始化内存在硬件层面不是问题,但MADV_FREE系统调用可能导致意外行为,slice_freeze_mut函数需页触摸以避免该问题。

引用与参考:
[1]:提到&mut [T]&mut [MaybeUninit<T>]的安全转换方式缺失。
[2]:提及人们希望未初始化内存存储任意数据,需冻结后安全读取。
[3]:说明读取未初始化内存在硬件层面不是问题,无未定义行为。
[4]:指出典型 Linux 环境中新分配的匿名页面会被零初始化。
[5]:引用 Donald Knuth 的话,强调应在关键代码处仔细考虑优化。

阅读 5
0 条评论