Safe C++ 提案概述
Safe C++ 提案旨在通过定义 C++ 的超集,扩展 C++ 语言,使其能够编写具有强安全性保证的代码,类似于 Rust 语言。其核心方法是引入一个新的 安全上下文,在该上下文中仅允许使用经过严格筛选的 C++ 安全子集。
背景与动机
该提案由 Sean Baxter 和 Christian Mazakas 提出,源于 C++ 内存不安全问题是大量漏洞和内存攻击的根源。目前唯一的安全语言是 Rust,但由于设计差异(如 Rust 缺乏函数重载、模板、继承和异常,而 C++ 缺乏特质、重定位和借用检查),语言之间的互操作性和迁移存在困难。Safe C++ 旨在提供一条更平滑的路径,确保现有代码可以无问题地编译,并允许用户逐步迁移到新的安全语言特性,或编写与不安全代码协同工作的新代码。
安全上下文的限制
在 Safe C++ 中,开发者被禁止编写可能导致生命周期安全、类型安全或线程安全未定义行为的操作。这些操作可能被编译器前端禁止(如指针算术),或通过静态分析检测。其余问题(如数组越界)则通过运行时 panic 和 abort 处理。
安全子集的设计目标
Safe C++ 的提案强调其安全子集必须保持 实用性。如果某些 C++ 特性(如指针和联合体)被移除,必须提供等效但安全的替代方案,以提升语言表达能力和开发者体验。例如,提案中引入了模式匹配、选择类型和借用等特性。
线程安全与数据竞争
为确保线程安全并减少数据竞争导致未定义行为的风险,Safe C++ 采用了类似于 Rust 的 Send 和 Sync 类型特质。
新特性与零成本抽象
提案还引入了显式引用突变(由借用系统要求)和对象重定位模型(Rust 中常见,但对习惯于管理原始指针和传统引用的 C++ 程序员来说较为陌生)。所有这些抽象都致力于实现 C++ 的 零成本抽象 目标。
未解决的设计问题
Safe C++ 的定义尚未完全确定,多个设计问题仍有待解决,包括函数参数所有权、具有生命周期的非静态成员函数以及从引用中重定位等。
其他安全改进提案
Safe C++ 并非唯一试图使 C++ 更安全的提案。InfoQ 最近报道了基于 C++ 配置文件(C++ Profiles)的提案,该提案由 ISO 委员会开发,旨在解决类型安全、边界安全和生命周期安全问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用。你还可以使用@来通知其他用户。