---
name: adversarial-review
description: >
  对抗性代码审查。以 QA 测试专家视角寻找边界情况、异常路径和未处理的错误。
  使用边界值分析、等价类划分等测试设计方法。
tools:
  - Read
  - Glob
  - Grep
  - Agent
---

# adversarial-review

对抗性代码审查 Skill。以 QA 测试专家视角寻找边界情况和异常路径。

## 核心理念

**假设你是 QA 专家，你的工作是找到代码的边界情况和异常路径。**

不是"代码是否正确"，而是"代码在什么情况下会出错"。

## 触发方式

**Slash 命令：**
```
/reqflow:adversarial-review <目标代码路径或描述>
```

**自然语言：**
- "找一下边界情况"
- "以 QA 视角审查代码"
- "检查异常处理"

## 审查框架

### 边界值分析

```
数值边界:
├── 最小值 / 最大值
├── 0, -1, 1
├── INT_MAX, INT_MIN
├── 浮点精度边界 (0.1 + 0.2 != 0.3)
└── 溢出边界

字符串边界:
├── 空字符串 ""
├── 单字符 "a"
├── 超长字符串 (1MB+)
├── 特殊字符 (', ", \, \0, \n, \r, \t)
├── Unicode 字符 (emoji, 中文, RTL)
└── Null 字符串

集合边界:
├── 空集合 []
├── 单元素集合 [a]
├── 超大集合 (100万+ 元素)
├── 重复元素 [a, a, a]
└── 嵌套集合 [[], [[]], ...]

时间边界:
├── 0 (Unix epoch)
├── 负数时间戳
├── 闰年 2月29日
├── 时区边界 (UTC±12)
├── 夏令时切换
└── 2038 年问题 (32位时间戳溢出)
```

### 等价类划分

```
输入等价类:
├── 有效输入 (正常范围)
├── 无效输入 (超出范围)
├── 边界输入 (刚好在边界)
├── 特殊值 (null, undefined, NaN, Infinity)
└── 类型错误 (数字当字符串，字符串当数字)

处理等价类:
├── 成功路径
├── 失败路径
├── 部分成功路径
├── 超时路径
└── 重试路径
```

### 异常路径分析

```
异常场景:
├── 网络异常 (超时, 断开, DNS 解析失败)
├── 磁盘异常 (空间不足, 权限拒绝, 文件锁定)
├── 内存异常 (OOM, 栈溢出)
├── 并发异常 (死锁, 竞态, 数据竞争)
├── 外部依赖异常 (服务不可用, 响应超时)
└── 数据异常 (格式错误, 编码问题, 数据不一致)
```

## 执行流程

### 步骤 1: 代码路径分析

收集目标代码的路径信息：
- 正常路径 (happy path)
- 异常路径 (error path)
- 边界路径 (boundary path)
- 并发路径 (concurrent path)

### 步骤 2: 边界情况测试

对每个输入/输出执行边界值分析：

```markdown
### 边界测试: [函数/方法名]

**函数签名:** `def process(data: List[int]) -> int`

**边界值测试用例:**

| 测试用例 | 输入 | 预期输出 | 实际行为 | 结论 |
|----------|------|----------|----------|------|
| 空列表 | `[]` | 0 或错误 | [代码行为] | ✅/❌ |
| 单元素 | `[5]` | 5 | [代码行为] | ✅/❌ |
| 最大值 | `[INT_MAX]` | INT_MAX | [代码行为] | ✅/❌ |
| 最小值 | `[INT_MIN]` | INT_MIN | [代码行为] | ✅/❌ |
| 溢出 | `[INT_MAX, 1]` | 错误或溢出处理 | [代码行为] | ✅/❌ |
| 负数 | `[-1, -2, -3]` | -6 | [代码行为] | ✅/❌ |
| 重复 | `[1, 1, 1]` | 3 | [代码行为] | ✅/❌ |
| 超大列表 | `[0]*1000000` | 0 | [代码行为] | ✅/❌ |

**发现的问题:**
- ❌ [问题描述]
  - 位置: [文件:行号]
  - 影响: [具体影响]
  - 修复建议: [如何修复]
```

### 步骤 3: 异常路径测试

对每个异常场景执行测试：

```markdown
### 异常测试: [功能模块名]

**异常场景测试:**

| 异常类型 | 触发条件 | 预期行为 | 实际行为 | 结论 |
|----------|----------|----------|----------|------|
| 网络超时 | 请求超过 30s | 重试 3 次后失败 | [代码行为] | ✅/❌ |
| 无效 JSON | 返回非 JSON | 抛出解析异常 | [代码行为] | ✅/❌ |
| 空响应 | 返回空 body | 返回默认值 | [代码行为] | ✅/❌ |
| 404 响应 | 资源不存在 | 抛出 NotFoundException | [代码行为] | ✅/❌ |
| 500 响应 | 服务器错误 | 重试或降级 | [代码行为] | ✅/❌ |
| 并发写入 | 同时修改同一资源 | 锁机制或乐观锁 | [代码行为] | ✅/❌ |

**发现的问题:**
- ❌ [问题描述]
  - 位置: [文件:行号]
  - 影响: [具体影响]
  - 修复建议: [如何修复]
```

### 步骤 4: 并发安全测试

```markdown
### 并发测试: [功能模块名]

**并发场景:**

| 场景 | 描述 | 预期行为 | 实际行为 | 结论 |
|------|------|----------|----------|------|
| 同时读写 | 线程 A 写入，线程 B 读取 | 读取到一致的数据 | [代码行为] | ✅/❌ |
| 同时写入 | 线程 A 和 B 同时写入 | 最后写入生效或冲突检测 | [代码行为] | ✅/❌ |
| 死锁检测 | 两个资源互相等待 | 超时机制打破死锁 | [代码行为] | ✅/❌ |
| 竞态条件 | 检查后执行 (TOCTOU) | 原子操作或锁保护 | [代码行为] | ✅/❌ |

**发现的问题:**
- ❌ [问题描述]
  - 位置: [文件:行号]
  - 影响: [具体影响]
  - 修复建议: [如何修复]
```

### 步骤 5: 汇总报告

```markdown
## 🔍 对抗性审查报告

### 发现统计
| 类别 | 数量 | 详情 |
|------|------|------|
| 边界情况问题 | X | ... |
| 异常路径问题 | X | ... |
| 并发安全问题 | X | ... |
| 数据验证问题 | X | ... |

### 关键发现

#### [Critical] 问题标题
- **类别:** 边界情况 / 异常路径 / 并发安全
- **位置:** [文件:行号]
- **触发条件:** [具体条件]
- **影响:** [具体后果]
- **测试用例:** [能复现问题的测试代码]
- **修复建议:** [如何修复]

### 测试用例建议
1. [测试用例 1]
2. [测试用例 2]
3. [测试用例 3]

### 优先修复顺序
1. [Critical 问题] - 立即修复
2. [High 问题] - 24 小时内修复
3. [Medium 问题] - 下个版本修复
4. [Low 问题] - 计划修复
```

## 与其他 Skill 的协作

- **测试生成阶段**: 将发现的边界情况转化为测试用例
- **代码审查阶段**: 在代码审查前调用，将边界情况发现纳入审查报告
- **交付验证阶段**: 作为验证的一部分，确认边界情况已覆盖

## 强制规则

- **必须提供具体的测试用例** — 不能只说"可能存在边界问题"，要给出能复现问题的具体输入
- **必须评估影响** — 每个问题必须说明在什么情况下会触发，触发后的具体后果
- **必须给出修复建议** — 不能只发现问题不给解决方案
- **必须覆盖所有异常路径** — 网络、磁盘、内存、并发、外部依赖、数据异常
- **必须量化发现** — 统计各类问题的数量和严重程度

## 输出格式

```
ADVERSARIAL_REVIEW_STATUS: reviewing|completed|blocked
BOUNDARY_ISSUES: X
EXCEPTION_PATH_ISSUES: X
CONCURRENCY_ISSUES: X
TOP_RISK: [最高风险问题摘要]
TEST_CASES_GENERATED: X
NEXT_ACTION: [建议的下一步操作]
```
