review · git:20260817.d4dfa41 · 2026-08-17 · sha256 598bbb9f7a2a0308

review git:20260817.d4dfa41A

Immutable. This exact content is served forever at /api/v1/blob/598bbb9f7a2a0308.

---
name: review
description: 审查一批改动时用。缺陷优先:找静默的错答案、反了的失败方向、没测试守着的关键分支,按严重程度报告并说清审了多大范围。风格问题交给 lint,不在这里人肉报。
---

# 审查改动

## 先定范围

```bash
git diff                        # 未提交的
git log --oneline main..HEAD    # 这条分支有哪些提交
git diff --stat main...HEAD     # 相对基线的全部改动
```

基线分支不一定叫 main,先看 `git remote show origin` 里的 HEAD 指向。
用户说「审一下」时通常指整条分支,不只是未提交的那点。

## diff 只是入口,不是全貌

`[约束]` 逐个改动文件**读完整文件**,至少读到改动点所在的函数和它的
调用方。diff 里看起来对的行,放进调用方的语境里经常是错的——参数顺序、
单位、调用约定这类错误在 diff 视图里不可见。

范围太大读不过来时,说明白哪些只扫了 diff,不要假装全读了。

## 该找什么(按回报排序)

**1. 静默的错答案。** 不报错不崩、只是结果错的那类:错误被吞掉后返回
空集合、部分结果被当成全量、截断或超时提前收工没说出来、缓存该失效没
失效。判据:这条路上有没有可能「半份东西被当成全部」。

**2. 失败方向反了。** 解析失败、超时、认不出的输入,落在哪一侧?权限
判不准变成放行、校验失败当成通过、catch 里吞掉异常继续走——这类改动
单看每一行都合理,方向反了就是安全洞。

**3. 调用方没跟上。** 改了函数的签名、语义或返回值,所有调用点都重审
过吗?grep 一遍比信 diff 可靠:编译器只抓签名,抓不住语义(原来返回
空表示「没有」,现在表示「出错」——类型没变,含义全变)。

**4. 有实现没测试守着。** 对每个关键分支问:把这行删掉或改反,会有
测试红吗?答不上来就是发现。尤其是错误处理分支——它们几乎从不被手工
测到。

**5. 边界。** 空集合、0、负数、超长输入、重复调用、并发。别全列一遍,
只报这次改动**真的会碰到**的那几个。

**6. 不该入库的东西。** 密钥、调试输出、被注释掉的大段旧代码、意外
带上的生成物或临时文件。

## 怎么报

按**严重程度**排,不按文件顺序。每条给:

- 位置(`起始行:结束行:路径` 的引用格式);
- **会怎么表现**——具体症状,不是「可能有风险」。说不出症状的发现
  多半不是发现;
- 建议的改法,或「需要一个测试守着这里」。

最后说清「没发现问题」覆盖了多大范围——审了 3 个文件和审了 30 个
文件,同一句「看起来没问题」含义完全不同。

## 不要做的事

- 不要顺手改。审查的产出是判断,改不改、怎么改由用户决定。
- 不要报 lint 管得了的事(命名、格式、能不能少写两行)。人肉报这些
  既浪费篇幅又稀释真发现。
- 不要为了显得认真而凑数。三条真问题比十条「建议考虑」有用。