C++ 安全性探讨:Herb Sutter 和 Bjarne Stroustrup 的观点
C++ 专家兼 ISO C++ 委员会主席 Herb Sutter 近期发表了一篇文章,探讨了如何使 C++ 成为像 Rust 和其他内存安全语言(MSLs)一样的安全语言。他提出了一系列建议,包括依赖工具、推广安全语言特性、将不安全特性隐藏在编译器标志后等。
主要观点
- 内存安全的重要性:Sutter 强调 C++ 需要大幅提升安全性,特别是解决与内存安全相关的四类主要漏洞:越界读取、越界写入、空指针解引用和访问已释放内存。这四类漏洞占所有 CVE 的约 70%。
- 默认启用安全规则:Sutter 认为,C++ 应默认启用安全规则,只有在程序员明确选择退出标准规则时,才允许不安全行为。这样既能保留语言的强大功能,又能减少无意中引入的风险。
- 工具的作用:Sutter 指出,内存安全语言(MSLs)同样依赖静态分析器和消毒器等工具。因此,C++ 的目标不应是完全消除内存安全相关的 CVE,而是通过工具和语言特性的结合来提升安全性。
误解与澄清
- 高严重性 CVE 与内存安全的关系:Sutter 澄清,大多数高严重性 CVE 并不直接与内存安全相关,尽管越界写入是主要问题之一。
- MSLs 的 CVE:内存安全语言同样存在 CVE,因此 C++ 的目标不应是完全消除所有内存安全问题,而是通过工具和语言特性的结合来提升安全性。
Bjarne Stroustrup 的观点
C++ 创始人 Bjarne Stroustrup 在回应 NSA 建议时表示,C++ 可以通过 C++ 核心指南实现与 Rust 相当的安全性,而无需引入 Rust 的复杂性。他提到,ISO 委员会正在研究 C++ 配置文件,这些配置文件旨在逐步采用更安全的行为,并在编译时强制执行。
C++ 配置文件
- 定义:配置文件是一组确定性和可移植的规则子集,旨在实现特定的安全保证。
- 类型安全、边界安全和生命周期安全:这些配置文件涵盖了类型安全、边界安全和生命周期安全。符合配置文件的代码在构建时就是安全的。
批评与回应
Jimmy Hartzell 对 Stroustrup 的回应提出批评,指出 C++ 尚未成为内存安全语言,且在线程安全等领域考虑不足,而 Rust 已经具备许多相关机制。
未来方向
Sutter 认为,配置文件是实现 C++ 安全性的关键特性,并相信通过配置文件可以减少 98% 的类型、边界、初始化和生命周期相关的 CVE,同时保留 C++ 的表达能力。他还提出了 C++ ISO 委员会可以采取的具体方向,以实现这一目标。
总结
Sutter 和 Stroustrup 都认为,通过工具和语言特性的结合,C++ 可以大幅提升安全性,而无需牺牲其表达能力和灵活性。C++ 配置文件是实现这一目标的关键,通过逐步采用更安全的行为,C++ 可以在保留其优势的同时,大幅减少内存安全问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。