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 行中进行了负值检查。

安全培训

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