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”排除了所有不良行为。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。