有界指针是指指针的使用被限制在有效的区域内。比如说,现在有一个32个元素的数组,禁止对这个数组使用的指针访问数组前面或后面的任何内存。
C没有对这类指针提供直接支持。不过,程序员可以显式地确保这个限制得以执行,如下所示:
#define SIZE 32
char name[SIZE];
char *p = name;
if(name != NULL) {
if(p >= name && p < name+SIZE) {
// 有效指针,继续
} else {
// 无效指针,错误分支
}
}
这种方法比较麻烦,相较而言,7.4节中讨论的静态分析可能会比较有用。
一种有趣的变化是创建一个指针检验函数(https://www.securecoding.cert.org/confluence/display/seccode/MEM10-C.+Define+and+use+a+pointer+validation+function),要这么做,必须知道初始的位置和范围。
另一种方法是利用ANSI-C和C++的边界模型检查工具(CBMC,http://www.cprover.org/cbmc/)。这个应用程序会对C程序做一些安全问题检查,然后发现数组边界和缓冲区溢出的问题。
注意 C++中的智能指针提供了一种模仿指针同时支持边界检查的方法,不幸的是,C没有智能指针。