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

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

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

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

在经修复的代码中,对 malloc() 的调用被简单地替换成了对 calloc() 的调用,以确保将分配的内存预初始化为零。这样,就不必在使用指针 ps 前,手动初始化 S2 结构中的每个元素。

在经修复的代码中,我们不使用 calloc() 函数分配内存,而是显式初始化结构 S1 中的成员,以便在指针 ps 中读取值时,已知它们是有效值。