## 释放后使用（Critical）

### 触发信号

- `free`/`delete`/`drop`/`Box::from_raw` 后继续使用该指针/引用
- 函数返回局部变量的指针或引用（`return &local_var`、`return local_array`）
- 迭代器失效（在 for 循环中删除/修改容器元素，继续使用迭代器）
- 智能指针 `reset()`/`release()` 后使用原裸指针
- `std::move` 后使用已移动的对象

### 判定流程

1. **识别释放点**：`Read` 提取所有 `free`/`delete`/`drop`/`reset`/`release` 调用，标记被释放的指针/引用
2. **追踪释放后使用**：对每个释放点，`Read` 检查后续代码是否仍然：
   - 解引用该指针（`*ptr`、`ptr->field`）
   - 传递该指针给其他函数
   - 与其他指针比较（`if (ptr == other)`）
3. **检查函数返回值**：`Read` 检查返回语句是否返回了局部变量的地址或引用
4. **检查迭代器失效**：`Read` 检查循环体内是否有容器修改（insert/erase/remove），修改后是否仍在使用迭代器

### 证据构造

确认缺陷后，输出需包含：
- 释放点（释放操作的位置，含文件:行号）
- 使用点（释放后的非法访问位置）
- 释放到使用的距离（是否在同一线程/函数内，悬空时间窗口）
- 安全影响（数据泄露、崩溃、任意代码执行——取决于被释放内存是否被复用）

### 排除

- 释放后指针被置空（`ptr = nullptr`）且后续有空值检查
- 使用 RAII/智能指针（`unique_ptr`/`shared_ptr`/`Box`）的生命周期由编译器管理
- Rust safe 代码（借用检查器保证）
- `std::move` 后未访问已移动对象（编译器在部分场景可检测）
