CXX.SUSPICIOUS_INDEX_CHECK.ZERO
如果访问数组前存在针对零的可疑索引检查,但索引值又未针对数组上边界进行检查,则 CXX.SUSPICIOUS_INDEX_CHECK.ZERO 检查器会查找缺陷。
漏洞与风险
如果超出数组大小的索引访问数组,可能会导致数据损坏、操作不当或崩溃。
缓解与预防
为了防止缓冲区溢出,访问特定索引处的数组前,先检查索引并未超出上下边界范围限制。
漏洞代码示例
复制
int get_index();
void foo()
{
int err = 0;
const int SIZE = 10;
int arr[SIZE];
int index = get_index();
if (index > 0) {
arr[index]=10;
}
}
由于访问数组前存在针对零的可疑索引检查,但索引值又未针对数组上边界进行检查,因此 Klocwork 在第 9 行报告 CXX.SUSPICIOUS_INDEX_CHECK.ZERO,提醒用户关注第 8 行的可疑索引检查。
修正代码示例
复制
int get_index();
void foo()
{
int err = 0;
const int SIZE = 10;
int arr[SIZE];
int index = get_index();
if (index >= 0 && index < 10) {
arr[index] = 10;
}
}
不会发生缓冲区溢出,因为第 8 行的约束条件“index >= 0 && index < 10”排除了所有不良行为。