UNINIT.HEAP.MIGHT

使用的堆可能未初始化

UNINIT.HEAP.MIGHT 检查器可以发现使用 malloc 分配的堆内存可能在使用前没有被初始化的情况。

漏洞与风险

使用未初始化的堆内存会导致严重的代码性能缺陷,因为分配到给定数据对象的值是从所分配的堆内存中随机选取的,并能反映先前所用对象或其他进程中的对象的状态。如果软件没有对内存进行正确的初始化,会发生意外结果,并可能存在安全隐患。

缓解与预防

在从常用分配函数 malloc() 返回后,堆内存一直未进行初始化。为了避免发生未初始化内存问题,务必确保所有变量和资源在首次使用之前全部进行显式初始化。

另外,也可以使用标准 calloc() 库函数,自动将所有分配的内存初始化为零。

漏洞代码示例

复制
  struct s {
    int i;
  };
  
  int f(struct s **v, int t) {
    *v = (struct s *)malloc(sizeof(struct s));
    if (t > 0) {
      (*v)->i = t;
    }
   return (*v)->i;
 }

Klocwork 标记了第 10 行,指出变量 (*v)->i 从第 5 行分配的内存获取值,其可能在第 10 行使用时尚未进行初始化。

相关检查器