CXX.SUSPICIOUS_INDEX_CHECK.CALL

当访问其他函数中的数组之前存在可疑的索引检查时,CXX.SUSPICIOUS_INDEX_CHECK.CALL 检查器将查找缺陷。

漏洞与风险

如果超出数组大小的索引访问数组,可能会导致数据损坏、操作不当或崩溃。

缓解与预防

在访问特定索引处的数组之前,执行适当的边界检查。

漏洞代码示例

复制
int get_index();
  
void set(int* arr, int index) {
    arr[index] = 0;
}
  
int main() {
    int SIZE = 15;
    int arr[10];
    int index = get_index();
    
    if (index >= SIZE) {  
        return 0;
    }
    set(arr, index);
}

Klocwork 在第 15 行报告 CXX.SUSPICIOUS_INDEX_CHECK.CALL,提醒用户关注第 12 行的可疑索引检查。

在另一个函数集中,如果第 4 行的索引值范围为 10-14,则可能取消引用数组,这可能会导致缓冲区溢出。

修正代码示例

复制
int get_index();
  
void set(int* arr, int index) {
    arr[index] = 0;
}
  
int main() {
    int SIZE = 10;
    int arr[10];
    int index = get_index();
    
    if (index >= SIZE) {  
        return 0;
    }
    set(arr, index);
}

不会发生缓冲区溢出,因为第 12 行的约束条件“index >= SIZE”排除了所有不良行为。

安全培训

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