## 内存问题检测

> 内存问题按语言内存管理模型分为三类：手动管理（C/C++/Rust）、GC（Java/JS/Python/Go）、跨语言通用。
> 本文件是检测路由表——根据代码特征和语言类型定位需要加载的检测项子文件。

### 检测路由表

| 触发信号（代码特征） | 语言范围 | 触发检测项 | 文件 |
|---------------------|---------|-----------|------|
| 数组/指针索引访问（`arr[i]`、`*(ptr + i)`）无边界检查 | C/C++/Rust | 缓冲区溢出 | [buffer-overflow.md](buffer-overflow.md) |
| 不安全函数（`strcpy`/`sprintf`/`gets`/`memcpy` 无长度参数） | C/C++ | 缓冲区溢出 | [buffer-overflow.md](buffer-overflow.md) |
| Rust `unsafe` 块中的切片/指针操作 | Rust | 缓冲区溢出 | [buffer-overflow.md](buffer-overflow.md) |
| `free`/`delete`/`drop` 后继续使用该指针/引用 | C/C++/Rust | 释放后使用 | [use-after-free.md](use-after-free.md) |
| 函数返回局部变量指针/引用（`return &local`） | C/C++ | 释放后使用 | [use-after-free.md](use-after-free.md) |
| 迭代器失效（循环中删除/修改容器元素） | C++/Rust | 释放后使用 | [use-after-free.md](use-after-free.md) |
| 同一指针多次 `free`/`delete`/`drop` | C/C++/Rust | 内存分配缺陷 | [memory-allocation.md](memory-allocation.md) |
| `malloc`/`new` 无对应 `free`/`delete`（所有路径） | C/C++/Rust | 内存分配缺陷 | [memory-allocation.md](memory-allocation.md) |
| `malloc`/`free` 与 `new`/`delete` 混用 | C/C++ | 内存分配缺陷 | [memory-allocation.md](memory-allocation.md) |
| 使用未初始化的局部变量/内存 | C/C++ | 不安全操作 | [unsafe-operations.md](unsafe-operations.md) |
| Rust `unsafe` 块中的裸指针解引用（`*raw_ptr`） | Rust | 不安全操作 | [unsafe-operations.md](unsafe-operations.md) |
| 分配大小由外部输入计算且未校验溢出 | C/C++/Rust | 不安全操作 | [unsafe-operations.md](unsafe-operations.md) |
| 对象互相持有引用（A→B→A），尤其通过回调/闭包 | GC 语言 | 引用残留 | [reference-retention.md](reference-retention.md) |
| 闭包捕获外部变量但闭包生命周期超出预期 | GC 语言 | 引用残留 | [reference-retention.md](reference-retention.md) |
| 全局缓存 Map/Set/Dict 只有 `put`/`add` 无 `remove`/`evict` | GC 语言 | 集合无界增长 | [collection-growth.md](collection-growth.md) |
| `addEventListener`/`on`/`subscribe` 未配对 `removeEventListener`/`off`/`unsubscribe` | GC 语言 | 回调泄露 | [callback-leak.md](callback-leak.md) |
| `setInterval`/`setTimeout` 未配对 `clearInterval`/`clearTimeout` | GC 语言 | 回调泄露 | [callback-leak.md](callback-leak.md) |
| 文件/网络/数据库连接（`open`/`connect`/`createConnection`） | 所有语言 | 资源泄露 | [resource-leak.md](resource-leak.md) |
| try-catch 中创建资源但无 finally/using/defer 释放 | 所有语言 | 资源泄露 | [resource-leak.md](resource-leak.md) |
| 未停止的 goroutine/thread（退出函数但线程仍在运行） | Go/Java | 资源泄露 | [resource-leak.md](resource-leak.md) |

### 使用方式

1. 识别变更代码的编程语言和内存管理模型
2. 读取变更代码，匹配上述触发信号
3. 按匹配到的触发信号，**只加载**对应子文件（无需全量加载）
4. 无匹配触发信号 → 不执行内存问题检测
5. 同一触发信号对应多个检测项时，按优先级执行：手动管理语言问题 > 跨语言资源泄露 > GC 语言问题

### 通用排除规则

以下情况不报告缺陷：
- **测试文件**：`*.test.*`、`*.spec.*`、`__tests__/` 目录
- **生成的代码**：`generated/`、`*.generated.*`、`node_modules/`、vendor
- **第三方依赖**：不可控的外部库代码
- **有明确 TODO/FIXME 注释**：开发者已知悉的问题
- **语言安全保证范围内**：Rust safe 代码的内存安全、Go 的边界检查（由编译器/runtime 保证）
