内存安全绝对主义者
2026年7月28日,皮奥特·萨尔纳基撰写 当看到这篇文章的标题时,我敢打赌,有些人心中第一个想到的就是“Rust开发者!”这种联系并非毫无根据。Rust开发者通常对内存安全充满热情。我相信,这种态度可能是由经典的语言战争心态造成的:我的语言比你的好,这就是原因。然而,我希望大多数声称关心内存安全的Rust开发者,确实关心使软件更安全,而不仅仅是批评与Rust竞争的语言。令人惊讶的是,这篇文章并不是关于Rust开发者的。直到最近,与内存安全相关的讨论大多基于相对简单的基础,尤其是在考虑非GC的系统编程语言时,比如C、C++、Zig和Rust。Rust的目标是禁止编译可能引入内存安全问题的程序(有时以禁止编译那些本应安全的程序为代价),其通过一个名为不安全(unsafe)的逃生口来允许某些事情,包括反引用原始指针。C等其他语言则把确保内存安全的责任留给程序员。语言所提供的帮助程度各不相同,例如C++中有RAII和智能指针,Zig中有延迟(defer),但在大多数情况下,没有什么可以阻止你违反内存访问。今天的情况有些不同,出现了一种新的方法,使C、C++,未来可能还有Zig的代码具有内存安全性:Fil-C。使用Fil-C编译的C和C++代码在无效内存访问(如越界访问或使用已释放内存)时将触发恐慌。它通过结合垃圾回收(GC)和InvisiCaps(一种跟踪指针可访问内存的方法)来实现这一点。Zig的作者最近宣布了一种新的编译模式,灵感来自Fil-C。Fil-C是一个非常有趣的项目,我真心希望它能够成功,并且至少一些流行的C和C++项目能够提供Fil-C编译的版本。在理想的世界里,关心内存安全的Rust程序员和C/C++/Zig程序员都会为有更多方法减少内存安全漏洞而感到高兴,但可悲的是,我们并不生活在一个理想的世界,我无法摆脱这样的感觉:最近对Rust的许多批评并不真诚。如果你在推特上阅读Fil-C的作者的观点,很明显他不喜欢Rust,我看到他声称Rust是一种不安全的语言,因为可以绕过使用不安全(unsafe)时的一些Rust保证。Zig的作者安德鲁·凯利似乎也持有类似的立场,这在fil编译模式的问题标题中得到了体现:“引入一个真正内存安全(与Rust不同)的编译模式,灵感来自Fil-C”。这意味着:Rust是不安全的,只有Fil-C或Zig的“fil”编译模式会处理内存安全相关的漏洞。在与Rust和Fil-C相关的讨论中,我常常看到类似的观点:“如果Rust的人真的关心内存安全,他们会推广Fil-C,而抛弃Rust,因为Fil-C更安全,否则他们只是关心他们的新奇语言,而不是内存安全。”这包括Fil-C的作者本人。我对安德鲁·凯利的想法不太确定,但我之前提到的问题标题真的感到非常接近。依我看,这类论点在忽视现实,感觉像是狂热主义和教派行为,Rust开发者常常被指责此类行为。如果Fil-C是一个绝对没有权衡的替代品,我或许会部分同意这种观点,但它是有权衡的:它与非Fil-C编译的程序不兼容,它在某些情况下可能慢几倍,并且引入了垃圾回收。对于某些程序来说,这些都不是阻碍。你日常使用的许多程序可能会比现在慢几倍,而你甚至不会注意到。它们中的许多也不动态链接任何东西,因此ABI兼容性并不重要。但并不是每个软件程序都是简单的实用程序。有很多流行的项目,在这些项目中,GC和ABI不兼容是个问题,他们不可能会采用像Fil-C这样的技术,至少在当前形式下不可能。至关重要的是,无法使用Fil-C的程序通常非常适合使用Rust。但是Rust不安全,不是吗?毕竟它有不安全(unsafe)代码!如果你想这样严格,换句话说,如果你是一个内存安全绝对主义者,这对你来说可能是真的。我,我希望大多数人,比这更加务实。关于Rust在实践中的安全性并没有很多数据,但据我所知,Rust软件中并没有很多可利用的内存安全漏洞,并且有一些大项目提供了一些数据,比如Android中的500万行:在Android平台上大约有500万行Rust代码,发现了一个潜在的内存安全漏洞(并在发布前修复),我们估算的Rust漏洞密度为每百万行(MLOC)0.2个漏洞。我们对C和C++的历史数据显示每百万行近1000个内存安全漏洞的密度。我们目前的Rust代码跟踪的密度……
本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。
☕请我喝杯咖啡