作者 | 徐杰承

审校 | 言征


在刚刚过去的2022年,C++以4.62%的流行增长率,时隔近20年再度荣获了TIOBE的年度编程语言桂冠。而作为C++语言的缔造者,C++之父Bjarne Stroustrup最近却显得有些“暴躁”。


去年9月,微软CTO Mark Russinovich在其社交账号上发布动态称:开发人员是时候停止使用C/C++来启动新项目,并建议在使用non-GC语言的场景中使用Rust。对此,Bjarne也在一次采访中回怼了Mark的言论。然而就在这次事件平息后不久,一个更具影响力的组织又将矛头指向了C++。


2022年年底,美国国家安全局(NSA)在其所发布的《Software Memory Safety》报告中指出:C语言和C++语言是不安全的,建议各组织放弃使用C/C++,并鼓励各组织将编程语言从C和C++等转向更加安全的替代语言——如C#、Rust、Go、Java或Ruby。对此,NSA网络安全主任Neal Ziring还在一次采访中表示,所有程序员都在犯简单的错误,这些错误依然非常普遍。


NSA的这篇报告,也再次激发了Bjarne的战斗欲望。在经历了数周的准备后,Bjarne于近日发布了一篇名为《Think seriously about“safety”;then do something sensible about it》的论文,正式回应了NSA一系列言论。而双方的这场隔空对话,也将C++这门拥有近30年历史的老牌编程语言再次推上了风口浪尖。

1、NSA:少用或禁用C/C++


在《Software Memory Safety》报告中,NSA指出:现代社会严重依赖软件的自动化与隐性信任,如果开发人员所编写的软件无法按照预期方式运行,那就意味着有时我们将不得不为恶意目的妥协。目前,恶意利用软件漏洞的行为经常基于内存问题,其中典型的例子便是内存缓冲区益出。


其举例称:微软在2019年的一次会议上就曾表示,自2006年至2018年,70%的漏洞是由内存安全问题引起的。恶意攻击者可以利用这些漏洞进行远程代码执行或其他非法行为。而谷歌也于近几年在Chrome浏览器中发现了类似的内存安全漏洞。


常用语言如C和C++,虽然提供了很大的自由度和灵活性,但在进行内存管理时,过于依赖于程序员来执行所需的检查内存引用。因此,简单的错误就可能导致基于内存和可利用性的漏洞。虽然软件分析工具可以监测到许多内存实例,管理事务和操作环境选项也可以提供一些保护,但内存安全语言的固有保护可以防止或减轻大多数内存管理问题。


技术的缺陷将使作恶者更容易找到存在问题的代码,使用内存安全语言可以防止程序员引入某些内存相关问题的类型。它们的语言特性将保护程序员无意中引入的内存管理错误。因此,美国国家安全局建议各组织选择“明智的做法”——减少或禁用固有内存保护问题的编程语言,如C/C++,尽可能使用内存安全语言,如C#、Rust、Go、Java或Ruby。

2、Bjarne:你们根本不懂C++


“认真考虑‘安全’,然后采取一些明智的措施”这是Bjarne回应NSA的论文的标题。“太多人谈论如神话般的C与C++,然后开始关注C语言的弱点,但这些缺点在C++中完全可以避免,并且C++能更加直接的表达程序员的想法”。在该文章中Bjarne表示,许多C++的使用者停滞不前,NSA完全忽略了C++30年来的进步,并将C与C++混为一谈,这令人感到非常遗憾。


“现在,如果我认为这些‘安全’的语言中任何一种在我说关心的使用范围内优于C++,我不认为C/C++的淡出是一件坏事,但事实并非如此”。Bjarne提到,NSA对“安全”的概念仅限于内存安全,而忽略了一门语言可能被用来违反某种形式的安全保障和十几种其他方式。


安全的目标应该是类型和资源安全,其中每个对象都根据其类型使用,并且没有资源泄露。对于C++,这意味着一些运行时规范检查,消除通过空指针的访问并避免类型转换和联合体的误用。C++提供了高级工具,如容器、span、range-for循环和变量,它们可以在不损害生产率或效率的同时提供保障。关于NSA提到的所谓安全语言,Bjarne表示,所有语言都容易收到未经静态验证的代码攻击,每个系统都必须使用硬件,而有效的硬件访问很少是安全的。


此外,Bjarne还提供了安全使用C++的一些策略:


  • 静态分析,以验证没有不安全的代码被执行

  • 编码规则,以简化代码,使工业规模的静态分析可行

  • 库,使简化的代码能简化编写,并确保在需要时进行运行时检查


Bjarne提到,目前世界上有数百万C++程序员与数十亿行C++代码,该语言被应用在包括航空航天、医疗仪器、人工智能/机器学习、知识图谱、生物医学及高能物理等领域,自己对于NSA的言论感到震惊。此外,在文章的末尾,Bjarne还对NSA提出了一个灵魂拷问:据我所知,在发布报告前,没有一位专家向C++标准委员会进行过资讯,所谓“明智的做法”是什么,建议列出一个明确的清单。

3、谁输谁赢并没那么重要


诚然,C++之父与美国国家安全局的这次隔空喊话,让广大开发者饱饱的吃了一次大瓜。但在这场针尖对麦芒的battle中,谁输谁赢其实真的没有那么重要。C++不安全、C++安全,这两种说法从辩证的角度来看都是正确的。我们必须承认NSA所提出的,的确有些语言在内存安全保障方面的语言特性是优于C++的;而对于Bjarne的回应,在合理使用工具和保障规范的前提下,C++也确实能够保证其安全性。


作为一门拥有30年历史的老牌编程语言,C++依然能够在今天保持其强大的竞争力,并在编程语言排行榜中位居前列,这无疑不证明着C++功能的强大,以及其在时代考验下的演进效率。正如Bjarne所说,如今我们拥有着数十亿行的C++代码,基于C++所编写的软件也运行在世界的每一个角落。无论在过去还是现在,世界上每天都会产生大量的C++代码与C++开发者,而这一趋势也将在未来继续延续。


每种语言都有自身的优劣势以及适合的应用场景,世界上并没有最好的编程语言,只有最适合的编程语言。在此借由Slashdot上一位网友的留言:你可以用C++写出安全的代码么?当然可以,用C、ASM甚至任何成熟的编程语言都可以做到。对于任何成熟语言,关键问题都不在于是否能做到,而在于如何选择和更好地使用它们。


参考链接:

https://www.infoworld.com/article/3686517/c-plus-plus-creator-bjarne-stroustrup-defends-its-safety.html

https://www.theregister.com/2022/11/11/nsa_urges_orgs_to_use/

https://developers.slashdot.org/story/23/01/21/0526236/rust-safety-is-not-superior-to-c-bjarne-stroustrup-says