FUM.GEN.MUST
释放未分配内存
如果释放未分配内存,会导致不可预测的结果。FUM.GEN.MUST 检查器会查找通过未初始化的指针调用的释放函数。
漏洞与风险
使用无效指针调用 free() 时,会导致程序内存损坏,进而导致程序崩溃,并可能产生会被攻击者利用的漏洞。
缓解与预防
为了避免释放非堆内存,需要确保:
- 仅释放之前使用 malloc() 在堆上分配的指针
- 保持对指针的跟踪,并且仅释放指针一次
- 仅释放程序右侧部分的内存
漏洞代码示例
复制
typedef struct list {
char * next;
} list;
typedef struct z {
list l;
} z;
void a6(){ // 8923
z * x = malloc(sizeof(z));
if (!x) return;
x->l.next=1;
free(x->l.next);
}
Klocwork 针对第 12 行生成问题报告,指出被 x->l.next 引用且在第 11 行分配的未分配内存已在第 12 行释放。释放未非配内存会导致应用程序崩溃,并可能产生易受攻击的漏洞。
扩展
此检查器可通过 Klocwork 知识库进行扩展。有关详情,请参阅调整 C/C++ 分析。