微软开源了Checked C,一个旨在对C和C++增加边界检查的研究项目。
\\C和C++语言上最大的漏洞之一可能就是越界的内存访问。根据美国国家标准技术研究所的国家漏洞数据库数据,从2010年至2015年,缓冲区溢出占所有安全漏洞的10-16%。由于大部分系统软件(操作系统、数据库、编译器、解释器、浏览器等)都使用C和C++两种语言之一编写,许多系统都面临内存冲突问题,这使得它们面临故障或者受到攻击,导致隐私信息泄露和系统被控制。来自微软和马里兰大学的一群研究者正在尝试解决这些问题,实现了Checked C,它是一个C语言的扩展和C++语言的子集,为这些语言增加边界检查。
\\不像现代语言(如Java、C#)这些自带自动边界检测,将该功能加入到C语言非常困难,项目参与者、微软研究员David Tarditi解释道:
\\\\\为C语言增加边界检查有两个障碍。第一是运行时边界信息的存放位置,第二是如何高效的进行边界检查。在实践中发现,改变所有C语言指针类型和数组,以携带边界信息不是一个有效的方案。C语言可能被用于系统基础,一些硬件和标准指定了数据布局,且数据布局无法改变。同时C程序还与现存的操作系统交互,这些软件都需要特定的数据布局。
\
Checked C允许程序员在C/C++中编写“确保边界检查”的代码。为了实现这个功能Checked C增加了新的指针和数组类型,它们可以在编译期和运行时进行边界检查:
\\该规范确定了变量操作行为,包括指针类型的间接寻址、数组引用、赋值、指针加法、比较、取址(\u0026amp;)、含边界检查数组类型和指针类型的转换等。
\\现存的C程序可以继续工作,很明显C*仍然未检查,且指针的算数运算会破坏当前代码。但是编译器可以通过增加参数在指针非正常使用时发出警告或者错误。
\\Checked C在GitHub上开源,包含规范、一个clang的实现和一个LLVM的实现。对此项目感兴趣的开发者被邀请参与项目,即可以改进规范、提出新的功能例如类型转换或者内存管理、增加测试,也可以扩展其他编译器对Checked C的支持。
\\过去也有其他尝试对C语言增加边界检查,包括使用静态分析、增强编译器或者运行时以避免修改语言本身、程序验证或者创造基于C的新语言。规范的第九章“相关工作”包含了这些其他实现的细节,并且解释了为什么作者选择了扩展语言。
\\查看英文原文:Checked C - A Safer C/C++ from Microsoft
\\感谢张龙对本文的审校。
\给InfoQ中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ,@丁晓昀),微信(微信号:InfoQChina)关注我们。