RABV.CHECK
访问超过数组大小的数组值
在检查索引是否位于数组边界内之前,检查器会查找访问数组的情况。
漏洞与风险
如果超出数组大小的索引访问数组,可能会破坏数据,导致操作不当和/或崩溃。
漏洞代码示例 1
复制
// some function returning an index
int get_index();
void main() {
const int SIZE = 10;
int arr[SIZE];
int index = get_index();
arr[index] = 0;
if (index >= SIZE) {
return;
}
}
Klocwork 报告第 10 行出现缺陷,指出在检查第 12 行索引的有效性之前,将其用于访问阵列。
修正代码示例 1
复制
// some function returning an index
int get_index();
void main() {
const int SIZE = 10;
int arr[SIZE];
int index = get_index();
if (index >= SIZE) {
return;
}
arr[index] = 0;
}
前一代码段的问题已修复;在将索引用于访问阵列之前对其进行检查。
漏洞代码示例 2
复制
int get_index();
void set(int* arr, int index) {
arr[index] = 0;
}
void main() {
int SIZE = 10;
int arr[SIZE];
int index = get_index();
set(arr, index);
if (index >= SIZE) {
return;
}
}
类似于示例 1,但不是在相同的函数 main 中访问阵列,而是作为参数传递至另一个函数 set。Klocwork 报告第 12 行出现缺陷,指出在检查第 14 行索引的有效性之前,将其用于访问函数 set 内的阵列。
修正代码示例 2
复制
int get_index();
void set(int* arr, int index) {
arr[index] = 0;
}
void main() {
int SIZE = 10;
int arr[SIZE];
int index = get_index();
if (index >= SIZE) {
return;
}
set(arr, index);
}
用相同的方式修复缺陷;现在在索引传递至第 16 行的函数 set 之前,在第 12 行检查其有效性。