微软开源了CheckedC,旨在对C和C++增加边界检查的研究项目。
CheckedC允许程序员在C/C++中编写“确保边界检查”的代码。为了实现这个功能CheckedC增加了新的指针和数组类型,它们可以在编译期和运行时进行边界检查:
ptr<T>:指向类型T且无须边界检查的指针。这种类型的指针不允许参与算数运算。当访问内存时,该类型指针不能为null。大部分指针应该用此类型。
array_ptr<T>:指向包含类型T数组的指针。该指针可以进行算数运算。当读写内存时它不能为null。程序员需要检查这类指针的边界。
span<T>:包含边界信息的指针。塔支持算数运算。当进行内存读写的时候不能为null。
Tarray_varchecked[100]:声明类型为T、大小为100的数组并且包含边界检查。当进行C语言类型转换时,包含边界检查的数组将被转换成array_ptr类型。
该规范确定了变量操作行为,包括指针类型的间接寻址、数组引用、赋值、指针加法、比较、取址(&)、含边界检查数组类型和指针类型的转换等。
现存的C程序可以继续工作,很明显C*仍然未检查,且指针的算数运算会破坏当前代码。但是编译器可以通过增加参数在指针非正常使用时发出警告或者错误。
CheckedC包含规范、一个clang的实现和一个LLVM的实现。
介绍摘自:https://www.infoq.com/cn/news/2016/06/checked-c
评论