C++的内存安全之路:向左走,向右走?

智能真的很好说 2024-09-20 15:12:35

在科技飞速发展的今天,编程语言的安全性问题愈发受到关注。昨日,一则关于C++社区发布革命性提案的消息如同一颗巨石投入平静的湖面,激起千层浪。

C++和C语言一直是白宫批评的目标,白宫在2月份敦促开发人员出于内存安全问题停止使用这些语言。C++创始人Bjarne Stroustrup通过为语言辩护来回应。安全C++扩展提案旨在扭转C++的趋势。据Falco称,该计划的一个关键组成部分是安全标准库,它将为开发人员提供基本数据结构和算法的内存安全实现。

内存安全:迫在眉睫的需求

近年来,各类安全漏洞频繁出现,让人们对软件的安全性提出了更高的要求。许多私营和公共部门组织开始大力推动开发者使用内存安全语言,如C#、Go、Java、Python和Swift。在这个大背景下,C++作为一种广泛应用的编程语言,其内存安全问题也日益凸显。

软件工程师Alex Gaynor早在2019年就指出,大型代码库中的大多数严重漏洞都来自内存安全缺陷,如缓冲区溢出和释放后使用。数据也一再证明,当项目使用内存不安全语言(如C和C++)时,就会受到大量安全漏洞的困扰。内存安全问题迅速成为学术论文和技术会议中的热门话题。2022年9月,微软Azure首席技术官Mark Russinovich呼吁开发人员弃用C和C++,转投Rust的怀抱。几个月后,美国国安局也采取了类似立场。到2023年,内存安全已然成为主流话题。

面对这样的形势,C++阵营不得不做出回应。C++语言的缔造者Bjarne Stroustrup在两年前回应Russinovich的呼吁时表示,“我们现在可以在ISOC++中实现完美的类型与内存安全保障。”然而,这个说法遭到了一些质疑。互联网安全研究小组的联合创始人兼执行董事Josh Aas指出,尽管理论上可以编写内存安全的C++代码,但在现实中却难以实现,因为C++在立项之初就没有充分考虑内存安全设计。

安全C++扩展提案的出现,正是为了解决这些批评,同时响应美国国安局等机构对于各公共部门提出的内存安全要求。这个提案的目标是解决C++编程语言中的致命弱点,让C++告别内存安全漏洞。C++联盟总裁兼执行董事Vinnie Falco也强调了这个提案的革命性意义,认为它将为C++带来内存安全功能,标志着C++生态系统的一个重要里程碑。

借鉴Rust:争议与挑战

安全C++扩展提案计划借鉴Rust的多项特性,包括借用检查和初始化分析等机制,以确保代码的正确性。这一举措引发了社区的争议。一些开发者对大量借鉴Rust的内容表示担忧,认为这可能会使C++失去其独特性。

一位二十多年的资深C++开发James20k指出,尽管提案基于实际需求且可选,但其对C++语言的改变可能比C++11的变动还要大。他希望C++能够以自身的方式进行改进,而不是试图模仿Rust。社区中的一部分技术人员也对借鉴Rust中的内容提出了异议,他们担心C++会变成某种奇怪的Rust混合体,失去C++的自由和主要卖点。

然而,C++联盟的开发人员Sean Gaxter和Christian Mazakas则认为,目前行业对于采用内存安全编程语言的呼声非常高,将C++代码迁移至Rust会带来很多问题。Rust缺少函数重载、模板、继承和异常机制,C++则缺少特征、重新定位与借用检查。这些差异导致两种语言在对接时产生不匹配状况,大多数用于跨语言绑定的代码生成器也无法用某一种语言的特性来表达另一种语言的特性。

此外,强迫资深C++程序员们学习Rust并不是理想的答案。用不同编程语言重写项目的成本很高,所以安全C++的目标是以更低的成本实现与Rust相同的健全性保证,进而降低内存安全的准入门槛。

C++与Rust的“信仰之争”

C++和Rust之间的竞争引发了一场“信仰之争”。有开发者认为,C++要么朝这个方向发展,要么输给Rust并消亡。这种观点反映了编程语言之间的竞争往往被过度情绪化。在Linux缔造者Linus Torvalds看来,如今Rust带来的争议,“几乎上升到了带有宗教战争色彩的信仰之争层面”。

Torvalds强调,他并不反感争论,因为真理越辩越明。Rust的一大优点在于它能让某些讨论焕发生机,但也会让不少争论变得非常激烈。C和Rust两派的分歧很大,有些人就是不喜欢Rust提出的概念,也不喜欢Rust侵占自己的领域。不少人甚至断言Rust的融合之路是失败的。

C和Rust各擅胜场。Rust支持者们拿出了大量有力的论据,如只要能够编译通过,代码质量就有保障,而且泛用性更好等。而C语言派则认为C更容易学习,在过去数十年的开发应用中积累下了巨大的生态财富,更适用于以内核为中心的eBPF开发。

安全C++扩展提案的出现,让C++站在了一个十字路口。一方面,内存安全问题确实迫切需要解决,借鉴Rust的特性可能是一种有效的解决方案。另一方面,大量借鉴Rust的内容可能会让C++失去其独特性,引发开发者的不满。

在这个关键时刻,C++需要找到一条平衡之路。既要解决内存安全问题,又要保持自己的特色和优势。这需要C++社区的共同努力,充分讨论和权衡各种方案的利弊。

安全C++扩展提案为C++的未来发展提供了一个新的方向,但最终的决策还需要C++社区的共同努力。在这个过程中,C++需要保持自己的特色和优势,同时积极解决内存安全问题,为开发者提供更安全、更高效的编程工具。只有这样,C++才能在未来的科技发展中继续发挥重要作用。

参考链接:

https://baijiahao.baidu.com/s?id=1810519550600723383&wfr=spider&for=pc

https://cppalliance.org/vinnie/2024/09/12/Safe-Cpp-Partnership.html

https://safecpp.org/P3390R0.html

https://www.youtube.com/watch?v=OM_8UOPFpqE&t=510s

https://thenewstack.io/linus-torvalds-c-vs-rust-debate-has-religious-undertones/

0 阅读:0