## 缓冲区溢出（Critical）

### 触发信号

- 数组/指针索引访问（`arr[i]`、`*(ptr + i)`、`ptr[offset]`）无边界检查
- 不安全函数调用（`strcpy`、`sprintf`、`gets`、`memcpy` 无长度参数）
- Rust `unsafe` 块中的切片/指针操作（`slice::get_unchecked`、`ptr::read_unaligned`）
- 固定大小缓冲区（`char buf[256]`、`[u8; N]`）的写入操作

### 判定流程

1. **识别缓冲区操作**：`Read` 提取数组访问、指针算术、不安全函数调用，标记缓冲区及其声明大小
2. **追踪索引/长度来源**：
   - 常量索引 → 检查是否在缓冲区范围内（`0 <= i < N`）
   - 变量索引 → `find_references` 追踪索引值的来源，判断是否可能越界
   - 外部输入作为索引/长度 → 必须有边界校验
3. **检查不安全函数替代**：`Read` 确认是否使用了安全替代（`strncpy`、`snprintf`、`memcpy_s`）
4. **检查 Rust unsafe 块**：`Read` 确认 unsafe 块内是否有边界校验逻辑，或是否可通过安全 API 替代

### 证据构造

确认缺陷后，输出需包含：
- 缓冲区声明（类型和大小，含文件:行号）
- 越界访问点（索引/偏移量的来源和值）
- 触发条件（什么输入会导致越界）
- 安全影响（栈溢出可导致代码执行、堆溢出可导致数据篡改）

### 排除

- 已有边界检查（`if (i < len)`、`assert(i < N)`）
- 已使用安全函数（`strncpy` 带长度参数、`snprintf`）
- Rust safe 代码（编译器保证边界检查）
- 已有 ASan/UBSan 检测覆盖的代码（需确认 CI 是否集成）
