## 回调泄露（Medium）

### 触发信号

- `addEventListener`/`on`/`subscribe`/`register` 未配对 `removeEventListener`/`off`/`unsubscribe`/`unregister`
- `setInterval`/`setTimeout` 未配对 `clearInterval`/`clearTimeout`
- 观察者/发布订阅模式的订阅未在适当时机取消
- EventEmitter/Bus 的监听器注册未清理

### 判定流程

1. **识别注册-注销对**：`find_references` 追踪 `addEventListener`/`on`/`subscribe` 等注册调用，标记所有 `removeEventListener`/`off`/`unsubscribe` 调用
2. **检查注销时机**：`Read` 确认注销是否在对象销毁时执行：
   - 类是否有 `dispose`/`destroy`/`cleanup` 方法
   - `componentWillUnmount`/`onUnmounted`/`finalize` 中是否有清理逻辑
   - 是否有 `AbortController` 模式的统一取消
3. **检查定时器清理**：`Read` 追踪 `setInterval`/`setTimeout` 的返回值，确认是否有对应的清理：
   - 组件卸载时清理
   - 错误路径中清理（不能只清理正常路径）
4. **检查观察者清理**：`Read` 确认订阅者是否在不再需要时主动取消订阅，而非依赖被观察者的生命周期

### 证据构造

确认缺陷后，输出需包含：
- 注册点（回调/监听器注册位置，含文件:行号）
- 缺失的注销点（应在何处清理但实际没有）
- 泄露的回调数量（如循环中注册但未清理）
- 业务影响（内存持续增长、已销毁对象仍被回调、事件处理异常）

### 排除

- 已使用 `AbortController` 统一管理（`signal.addEventListener`）
- 已使用 `{ once: true }` 的单次监听器
- 框架自动管理的监听器（React useEffect cleanup、Vue onUnmounted 中已清理）
- 全局/应用级监听器（设计上生命周期与应用相同）
