为什么现代C ++仍然不如Rust和Swift这样的内存安全语言安全
Alex Gaynor是Mozilla的一名软件工程师,在Firefox上工作,此前曾担任Python Software Foundation和Django Software Foundation的董事。
他在一篇新博客文章中指出,内存不安全语言(主要是C和C ++)会引发大量安全漏洞,并且行业默认需要迁移到诸如Rust和Swift之类的内存安全语言。
我经常收到的答复之一是问题不是C和C ++本身,开发人员只是认为它们是错误的。特别是,我经常收到以下形式的C ++辩护:“如果您不使用任何从C继承的功能,则C ++是安全的”,或者类似地,如果您使用现代C ++类型和习惯用法,则可以免受内存损坏的影响困扰其他项目的漏洞。我想归功于C ++的智能指针类型,因为它们确实有很大帮助。不幸的是,我在使用现代惯用语的大型C ++项目上工作的经验是,这些几乎不足以阻止大量漏洞 …
现代C ++惯用语引入了许多可能改善安全性的更改:std :: span确保您始终拥有正确的长度,std :: variant为联合提供了更安全的抽象。但是,现代C ++还引入了一些令人难以置信的新漏洞来源:lambda捕获释放后使用,未初始化值的可选值以及未限制检查范围。
我在编写相对现代的C ++和审核Rust代码(包括大量使用unsafe的 Rust代码)方面的专业经验是,现代C ++的安全性与Rust和Swift(或Python和JavaScript,尽管我发现生活中很少有一种程序可以用任何一种编写Python或C ++)。将现有的大型C和C ++代码库迁移到另一种语言面临着巨大的挑战-没有人能否认这一点。然而,问题只是要如何我们可以完成它,而不是如果我们应该尝试。
该帖子重点介绍了他所描述的“产生漏洞的完全现代的C ++习惯用法”-包括一个悬空指针的示例“尽管我们在整个过程中都谨慎使用了智能指针…”
“即使有最先进的C ++习惯用法,证据仍然是显然,大规模地持有C ++是不可能的。”