JD.INF.ALLOC

无限循环内的分配

在无限循环内,已使用大量内存且没有对可用内存进行验证时,会发生 JD.INF.ALLOC。

漏洞与风险

该软件不能正确地控制内存分配。如果攻击者可以触发不受控制的内存分配,那么最终会导致可用资源耗尽,也称为拒绝服务攻击。拒绝服务攻击会降低应用程序及其主机操作系统的速度,阻止有效用户访问软件,并可能对周围环境产生影响。

缓解与预防

检查可用内存,并且不要使用无限循环。例如,使用 Runtime.getRuntime().freeMemory() 方法来检查可用内存。

漏洞代码示例

复制
   while(true)
   {
     byte[] b = new byte[NUMBER];
     list.add(b);
   }

在以上示例中,无限分配可能导致 OutOfMemoryError 异常。Klocwork 报告第 3 行出现 JD.INF.ALLOC 缺陷,这表示“无限循环内的内存分配可能会导致 OutOfMemoryError”。

修正代码示例

复制
   while(true)
   {
     if (Runtime.getRuntime().freeMemory() > NUMBER) {
       byte[] b = new byte[NUMBER];
       list.add(b);
     }
   }

通过使用 Runtime.getRuntime().freeMemory() 方法添加可用内存检查,可以修复此问题。