RN.INDEX
在进行负值检查前对索引进行可疑的使用
务必确保定义为 int 的缓冲区索引变量不是负数,因为这可能导致缓冲区溢出。但是,如果变量在接受检查前就在代码中被用作索引,则检查为多余或应在使用索引之前进行。RN.INDEX 检查器会标记将变量用作缓冲区索引,并且在对其进行负值检查之前就使用该变量的实例。
漏洞与风险
如果已知要进行负值检查的缓冲区索引是正值,则检查是多余的。否则,应在使用索引之前进行检查,否则它将没有意义。
漏洞代码示例
复制
public int foo(int *a, int t)
{
int x;
x = a[t];
if (t >= 0)
x++;
return x;
}
在本示例中,Klocwork 报告第 5 行出现 RN.INDEX 缺陷,在该行中对索引变量 t 进行了负值检查。因为它已经在第 4 行中被用作缓冲区索引,所以检查为时已晚。如果已知变量“t”为正值,则检查为多余。如果不是,应将检查放在将变量用作索引之前进行。
修正代码示例
复制
public int foo(int *a, int t)
{
int x;
if (t >= 0)
{
x = a[t];
x++;
}
return x;
}
在该修正代码示例中,变量在第 6 行中用作索引之前,在第 4 行中进行了负值检查。