C++会像Rust和其他语言一样成为安全语言吗?

C++ 安全性探讨:Herb Sutter 和 Bjarne Stroustrup 的观点

C++ 专家兼 ISO C++ 委员会主席 Herb Sutter 近期发表了一篇文章,探讨了如何使 C++ 成为像 Rust 和其他内存安全语言(MSLs)一样的安全语言。他提出了一系列建议,包括依赖工具、推广安全语言特性、将不安全特性隐藏在编译器标志后等。

主要观点

  1. 内存安全的重要性:Sutter 强调 C++ 需要大幅提升安全性,特别是解决与内存安全相关的四类主要漏洞:越界读取、越界写入、空指针解引用和访问已释放内存。这四类漏洞占所有 CVE 的约 70%。
  2. 默认启用安全规则:Sutter 认为,C++ 应默认启用安全规则,只有在程序员明确选择退出标准规则时,才允许不安全行为。这样既能保留语言的强大功能,又能减少无意中引入的风险。
  3. 工具的作用: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++ 可以在保留其优势的同时,大幅减少内存安全问题。

阅读 26
0 条评论