不管软件公司在工具和培训开发人员上面投入了多少资金,“C++就其核心而言不是一种安全的语言”,
微软的云开发者代言人Ryan Levick在上个月的AllThingsOpen 虚拟会议上表示,当时他解释了为何微软正逐渐从C/C++改用Rust来构建其基础设施软件。
微软还鼓励其他软件行业巨头考虑采取同样的做法。
他说:“我们使用的语言很古老,来自不同的年代,无法为我们提供防范种种漏洞的能力。C++不是一种内存安全的语言,没人会真的假装它是内存安全的语言。”
实际上,微软认为C++不再适合编写关键任务软件。业界迫切需要改用一种高性能的、内存安全的语言来完成底层系统工作。Levick表示,而如今市面上的最佳选择就是 Rust。
C/C++无法被修复
如今,C和C++是编写核心系统软件的首选语言。优点是速度快,代码与机器本身之间只隔一层汇编。
但是业界正被这些语言引起的各种内存相关的缺陷(许多缺陷是安全问题)搞得焦头烂额。Levick表示,现在,来自微软的通用漏洞披露(CVE)中70%是内存安全问题。他说:“几乎一直是这种情况,并没有减少的趋势。尽管我们付出了巨大的努力来解决这个问题,但这仍似乎司空见惯。”
鉴于修复这些没完没了的内存相关错误面临不断上升的成本,从财务角度来看,这(注:继续使用C和C++)不无道理。Levick表示,早在 2004 年,每个内存相关错误让业界花费250000美元,微软估计这个数字可能偏低。
当然,许多公司和开发人员在努力提升C++的安全性,虽然各自在某个方面很有效,但没有一个从整体上解决这个问题。
一种长期被奉行的做法是加强针对程序员的培训,以便编写更安全的代码。但是,“没有证据表明,对C和C++开发人员进行全面的培训实际上能卓有成效地解决这个问题”,Levick 说,他提到微软本身很注重培训内部开发人员的工作。
静态分析是被提到的另一种可能的解决方案。但是静态分析带来了太大的开销:它需要被连入到构建系统。Levick说:“所以存在不使用静态分析的诸多动因。如果静态分析默认情况下不启用,就毫无帮助。”
运行时检查也是如此:“想知道什么时候使用了运行时检查合约、什么时候没使用,这不可能或至少极其困难,”他说,而且它们也会带来操作上的开销。
业界的最大希望
为了应对这个内存相关错误问题,微软安全响应中心发起了“安全系统编程语言倡议”。该中心做了一些工作,专门用来提升C/C++的安全性。该中心还开发了Verona,这种新的编程语言是为安全低级编程开发的。但是这个项目策略的第三个部分(也是微软最寄予厚望的部分)旨在支持“业界最有希望直面处理这个问题。”
他说:“而我们认为那第三个部分就是Rust。”
从性能上看,Rust与C/C++不相上下,甚至可能更快一点。Rust 给开发人员带来了工作效率,拥有软件包管理和现代测试框架等功能。广大程序员因此而喜爱 Rust。
但是微软如此钟情Rust 的主要原因是,它是一种内存安全语言,只有极少的运行时检查。Rust 擅长构建正确的程序。大致说来,正确性是指编译器检查程序有无不安全操作,因而减少了运行时错误。不安全的关键字是个选项,但并不是默认的。不安全的 Rust 代码几乎总是一段更庞大的安全代码的子集。不安全的代码对于内存分配型任务(比如编写设备驱动程序)必不可少。但即使在这种情况下,内存中不安全的部分也在API后面被封装起来。
Levick表示,安全编程的这种能力不应该被轻视。实际上,它可以带来逾10倍的提升,因此值得投入心血。这主要是由于几乎所有的C/C++代码都需要接受安全审计、查找有无不安全行为,而用Rust编写的需要接受检查的不安全代码只是大多数代码库的一小部分。
虽然微软看好Rust,但Levick 承认微软核心开发人员短时间内不会停止使用C/C++。
他说:“我们微软有很多的C++代码,这些代码不会被抛弃。实际上,微软在继续用C++编写代码,会继续用它编写一段时间的代码。”
许多工具是围绕C/C++构建的。尤其是,微软的二进制代码现在几乎完全是在Microsoft Visual C++编译器(可生成 MSVC二进制代码)上构建的,而 Rust 依赖 LLVM。
不过可能最大的挑战在于文化层面的。Levick承认:“总有一些人就希望用他们熟悉的语言来完成工作。”
不过,业界似乎正在追捧Rust。AWS使用Rust,除了用于EC2的一些部分外,一方面还用于部署 Lambda Serverless 运行时环境。Facebook 已开始使用 Rust,苹果、谷歌、Dropbox 和 Cloudflare 也已开始使用它。
![60092f1c0a4cb0898183ed89a90b1777.png](https://i-blog.csdnimg.cn/blog_migrate/d7a733b7eb4f9e712638712773cf4a5b.jpeg)
![bce0ce1734d5eacfc09a5dfaf460d157.png](https://i-blog.csdnimg.cn/blog_migrate/5cc4ae97b4565f7444b8be5b8b75a163.png)