14日消息,ISO C++委员会主席赫伯·萨特(Herb Sutter)已经于本周从微软离职,此前他已经为微软效力了22年,并选择加入Citadel Securities担任技术研究员,负责技术战略和培训。他将继续担任ISO委员会主席,并称2024年是C++语言的“关键一年”。
“危险”的C++,内存安全性进展算不上快
正如萨特所说,2024年是C++的关键之年。
更大一部分还是来自美国政府的压力。因为提升内存安全已上升到美国国家安全议题。受到白宫、“五眼”情报机构、联邦执法机构及美国网络安全与基础设施局等机构的支持。这一点并非空穴来风,根据谷歌的数据,内存安全漏洞约占零日漏洞的 75%,并且在大型代码库中的严重漏洞中,约 70% 都源于此类漏洞。
不巧的是,作为老语种,C 和 C++ 经常引发内存安全漏洞,因为它们依赖手动内存管理。手动内存管理的优势是通常性能更好,开销更小,对比 Python 或 Java 这样的语言则通过垃圾回收来管理内存。然而,手动内存管理可能会导致缓冲区溢出、使用释放后的内存等内存相关的错误。
今年2月,美国白宫就宣布需要在C和C++上采取一些措施来提升内存安全,要么就切换到Rust。
这在 C 和 C++ 社区中,这引发了广泛的讨论,因为这两种语言都不具备内存安全性,并且能否实现内存安全都存在很大争议。
当时 C++ 社区的一个回应是提出了 Safe C++ 的提案。
当时还是C 和 C++ 委员会成员的前计算机科学教授、产品设计师及图形专家Robin Rowe 提到了 C++ 之父的决定。
据 Rowe 所言,C++ 语言的创建者 Bjarne Stroustrup 表示他一直在研究“Profiles” [PDF],并希望继续下去。“我很尊敬 Bjarne,但我不认为 Profiles 是正确的答案,” Rowe 说。“而在 C 社区,答案则更不明确,没有真正的行动计划。”
C++ 中一些最大的内存安全漏洞是从 C 继承的。“在3月的会议上,我们讨论了如何改进异常处理,使 C++ 能有更好的错误处理能力。”Rowe 表示,游戏开发、嵌入式系统及高可用性服务器的开发者通常禁用异常,因为它们具有非确定性并且会带来性能问题。
那么,C++对于安全性的实际动作和方向是什么?在之后的CppCon上,萨特表示,安全性并不等同于完美,但将优先解决“易达的安全目标”,包括在标准库中引入更多安全库、消除与安全相关的未定义行为、增加编译时的静态安全规则和动态安全检查。
C++26:2026年中期完成,
自C++11以来影响最大的一次变革
萨特在9月的CppCon会议上表示,“C++ 26标准可能会改变我们开发软件的方式”,并将成为自C++11以来对语言影响最大的一次变革。C++ 26标准预计将在2026年中期完成,目前Clang和GCC等编译器中的某些特性已开始逐步实现。
萨特指出了C++ 26的四个关键特性:
对std::execution(用于异步操作的标准库)的改进,以增强并发性和并行性。类型和内存安全性增强,目标是与其他现代、更安全的语言接轨。反射和代码生成,这是“我们转向编译时编程的一个重大变化”,也是“可能最具影响力的特性”。合约特性,用于指定接口并检查其符合性,包括前置条件、后置条件和状态断言。萨特在本周的博客中提到,上一个里程碑C++11版本为现代C++引入了auto、lambda表达式和智能指针等特性,而C++ 26的特点将是“默认安全”以及对基于反射的生成型编译时库的全面支持。
萨特对该语言充满热情:“反射/生成带来了无限可能!期待完整标准化和编译器实现!”有开发者在演讲后评论道。
然而,也有开发者对语言的日益复杂表示担忧:“整个语言变得如此复杂。像Cppfront这样的项目有所帮助,但我们需要一个从C++灰烬中崛起的新语言,而不是Rust。”Cppfront是萨特创建的一个实验性编译器,用于验证新概念。
由于需要与遗留代码保持兼容性,因此添加语言特性总是比删除它们更容易。
实施C++新特性,微软有些缓慢
萨特曾在微软从事Visual C++的工作,这是该公司在Windows和Office等关键应用程序中广泛使用的工具。
考虑到萨特在ISO委员会中的职务,Visual C++在实施新的C++特性方面相较于Clang和GCC往往较为缓慢,这一点颇为奇怪。
有人认为,部分原因是因为近年来,微软内部一些知名人士出于安全性和可靠性的考虑,主张转向Rust,Azure首席技术官Mark Russinovich就是其中之一。
改进C++内存安全新思路
当然,C++也在努力实现白宫的内存安全的要求,并不是只有转向Rust这一条可走。
本周Rowe 就提出了一种改进内存管理的TraPC思路,利用编译器的智能,避免不必要的指针检查,以提升性能。他希望编译器能够自动清零越界的指针,从而避免产生危险的“野指针”。
TrapC 的设计理念是让 C 语言保留大致不变的样式,但指针和错误处理以更透明的方式进行。
不过,由于现有的 C++ 标准委员会流程缓慢,Rowe 认为走传统提案路线过于耗时,因此选择直接分叉 C 语言。
参考链接:
https://devclass.com/2024/11/12/iso-c-chair-herb-sutter-leaves-microsoft-declares-forthcoming-c-26-most-impactful-release-since-c11/