经常有程序员为C++辩护说:“只要你不使用任何从C继承过来的功能,C++就是安全的”!但事实非如此。根据本文作者在大型C++项目上(遵从现代的惯用做法)的经验来看,C++提供的类型完全不能阻止漏洞的泛滥。本文中就会给出一些完全根据现代C++的惯用做法编写的代码,你会发现这些代码仍然会引发漏洞。
作者
AlexGaynor
译者
弯月
责编
郭芮
以下为译文:
我经常批评内存不安全的语言,主要是C和C++,以及它们引发的大量安全漏洞。根据大量使用C和C++的软件项目的审查结果,我得出了一个结论:软件行业应该使用内存安全的语言(例如Rust和Swift)。
人们常常在回复我时说,这个问题并不是C和C++本身的问题,而是使用这两种语言的开发者的错。
具体来说,我经常听到人们为C++辩护说:“只要你不使用任何从C继承过来的功能,C++就是安全的”(我理解这句话指的是原始指针、数组作为指针使用、手动malloc/free以及其他类似功能。但我认为有一点值得注意,由于C的特性明确地融入了C++,那么在实践中,大部分C++代码都需要处理类似的情况。),或者类似的话,比如只要遵从现代C++的类型和惯用做法,就不会引发内存方面的漏洞。
我很感谢C++的智能指针类型,因为这种类型的确非常有用。不幸的是,根据我在大型C++项目上(遵从现代的惯用做法)的经验来看,光靠这些类型完全不能阻止漏洞的泛滥。我会在本文中给出一些完全根据现代C++的惯用做法编写的代码,你会发现这些代码仍然会引发漏洞。
掩盖“释放后使用”的引用
我想说的第一个例子最初是KostyaSerebryany提出的(