C++ 会变成像 Rust 一样的安全语言吗?
内容提要
C++专家Herb Sutter建议通过依赖工具、推广安全语言特性以及显式启用不安全特性来提高C++的安全性。Bjarne Stroustrup表示赞同,并提到ISO委员会在C++配置文件方面所做的工作。批评者认为,与Rust相比,C++在内存安全性方面仍然存在不足,例如线程安全。Sutter和Stroustrup认为,配置文件是使C++更安全的关键特性,而不会限制其表达能力。Sutter提供了具体建议,以帮助ISO委员会实现减少C++代码中CVE的目标。
延伸解读
C++ 安全改进的核心思路
Herb Sutter 提出的安全改进方案强调依赖工具、推广安全语言特性,并要求不安全特性显式启用。他特别指出,越界读、越界写、空指针解引用和访问已释放内存是四类主要内存安全漏洞。这些建议旨在通过默认执行安全规则来减少无意风险,同时保留 C++ 的表达能力。
Profiles 机制与安全保证
Bjarne Stroustrup 支持的 C++ profiles 是一组确定性、便于强制执行的规则子集,包括类型安全、边界安全和生命周期安全。符合这些规则的代码被认为安全,因为它们提供了安全保障。Sutter 和 Stroustrup 都认为 profiles 是减少 CVE 的关键,有望将相关 CVE 减少 98%。
与 Rust 的对比及批评
批评者如 Jimmy Hartzell 指出,C++ 在内存安全方面仍不足,尤其是线程安全等领域,而 Rust 已有许多相关机制。即使是在系统编程领域,Rust 也提供了可行的内存安全替代方案,且没有 C++ 那么多技术债务。这反映了 C++ 在安全方面面临的竞争压力。
现实目标与局限性
Sutter 提醒,大多数高严重性 CVE 与内存安全无关,内存安全语言也有 CVE,且同样依赖静态分析等工具。因此,最终目标不是完全消除 CVE,也不是在不依赖工具的情况下强制执行内存安全规则。C++ 的安全改进是一个渐进过程,需要平衡安全与表达能力。
Q&A
C++如何提高安全性?
C++可以通过依赖工具、推广安全语言特性和显式启用不安全特性来提高安全性。
Herb Sutter提到的四种内存安全漏洞是什么?
四种内存安全漏洞包括越界读、越界写、空指针解引用和访问已释放内存。
Bjarne Stroustrup对C++安全性的看法是什么?
Stroustrup认为C++可以像Rust一样安全,但不那么复杂,并支持ISO委员会的安全规则工作。
C++配置文件的作用是什么?
C++配置文件是一组规则,旨在强制执行安全行为,确保代码的类型安全、边界安全和生命周期安全。
C++与Rust在内存安全性方面的比较如何?
批评者认为C++在内存安全性方面仍存在不足,特别是在线程安全等领域,而Rust则提供了更多相关机制。
Sutter对C++安全规则的建议是什么?
Sutter建议C++应严格执行安全规则,默认启用安全规则,只有在程序员明确选择时才允许不安全行为。