开发了 ntpd-rs、sudo-rs、zlib-rs 和 bzip2-rs 等项目的 Trifecta Tech 基金会宣布,Firefox 将使用 zlib-rs 库进行 gzip 压缩和解压缩。除了防止内存错误外,从 zlib 切换到 zlib-rs 还显著提升了性能——测试表明,单次解码操作的速度提升了 3.3 到 32.5 倍,连续流解码的速度提升了 2.7 到 10.86 倍。
zlib-rs 库已包含在 Firefox 151 版本中,但集成后,部分用户遇到了因越界执行导致程序崩溃的问题。经查,在 Rust 代码中,该问题会导致程序崩溃;而在 C 代码中,类似情况只会导致静默数据损坏,程序不会停止运行。作为解决方案,在 151.0.1 版本中,已恢复使用旧版本的 zlib 库。
该问题最早在一年多前的早期版本测试中被发现,但当时无法在开发人员的系统上重现。最终,经过一年的 beta 用户测试后,决定在 Firefox 151 中启用 zlib-rs。在收到一系列新的问题报告并对问题模式进行调查后,发现崩溃是由基于第 13 代和第 14 代 Raptor Lake 微架构的 Intel CPU 中的微代码错误引起的,该错误与使用了错误的寄存器有关。
出现此问题的原因是 LLVM 代码生成器在将霍夫曼编码结果写入内存时使用了“mov byte ptr [rsi + rdi + 1], ch”指令。在 Raptor Lake CPU 上执行此指令时,本应写入 RCX 寄存器中对应于 CH 寄存器的 8-15 位,却错误地写入了对应于 CL 寄存器的 0-7 位。为了配合 Firefox 152 的发布,我们实现了一个变通方案,并将该补丁移植到了 zlib-rs 的主版本中。该问题指令的生成是在 LLVM 22 中发现的(在 LLVM 23 开发分支中不会生成)。
来源: opennet.ru
