## 内存分配缺陷（High）

### 触发信号

- 同一指针多次 `free`/`delete`/`drop`（double free）
- `malloc`/`new` 分配的内存在某些路径上未释放
- `malloc`/`free` 与 `new`/`delete` 混用
- `realloc` 后未更新所有持有旧指针的变量

### 判定流程

1. **识别分配-释放对**：`find_references` 追踪 `malloc`/`calloc`/`new` 分配的指针变量，标记所有 `free`/`delete` 调用
2. **检查配对完整性**：`Read` 提取函数的所有退出路径（return、throw、goto），确认每条路径上分配的内存都有对应释放：
   - 正常路径：是否有 free/delete
   - 异常路径（catch/throw）：是否有 free/delete
   - 早返回（early return）：是否有 free/delete
3. **检查释放后置空**：`Read` 确认 `free`/`delete` 后是否将指针置空（防止 double free 和 use-after-free）
4. **检查分配/释放匹配**：`Read` 确认 `malloc` 对应 `free`、`new` 对应 `delete`、`new[]` 对应 `delete[]`，无交叉混用
5. **检查 realloc 更新**：`Read` 确认 `realloc` 后所有持有旧指针的变量是否更新为新指针

### 证据构造

确认缺陷后，输出需包含：
- 分配点（内存分配位置，含文件:行号）
- 缺失释放的路径（哪条退出路径遗漏了释放）
- 分配/释放不匹配的具体位置（如 malloc + delete）
- 业务影响（内存持续增长导致 OOM、double free 导致堆损坏）

### 排除

- 使用 RAII/智能指针（`unique_ptr`/`shared_ptr`/`Box`/`Vec`）自动管理
- 内存池/自定义分配器的内部实现（由分配器本身保证）
- 短生命周期程序（命令行工具，进程退出后 OS 回收）
- Rust safe 代码（所有权系统保证）
