用途:审计 Go 代码库中的 //nolint 指令,找出两类问题——已失效的抑制(代码已变、lint 规则不再触发)和理由敷衍的抑制(底层代码本可修复而非压制)。它不轻信注释,而是通过对抗式辩论挑战每条理由。
前置检查:需同时具备 go 与 golangci-lint。检查命令:go version 2>/dev/null && golangci-lint --version 2>/dev/null。若 go 未安装则停止并报告;若缺 golangci-lint,从 https://golangci-lint.run/welcome/install/ 安装。两者缺一不可。
发现指令:grep -rn '//nolint' --include='*.go' . | grep -v vendor/,匹配 //nolint、//nolint:rule、//nolint:rule1,rule2 等变体,记录文件与行号、被抑制规则(无规则记为 bare)、理由注释及约 5 行上下文。裸 //nolint 直接进入第二阶段。若未发现任何指令,报告代码库干净并停止。
第一阶段机械验证:对带具名规则的指令,同时启用 nolintlint 与目标规则测试抑制是否仍需要。v2 语法:golangci-lint run --enable-only=<rule>,nolintlint --allow-parallel-runners <file>;v1 语法:golangci-lint run --disable-all --enable=<rule>,nolintlint --allow-parallel-runners <file>。若 nolintlint 报告指令未使用,即为失效,无需改源码。多规则指令逐条测试,最多并行 3 条命令,始终使用 --allow-parallel-runners。若因构建错误、缺依赖等非目标规则原因失败,跳过并标记“无法验证”。分类为 Stale(可安全移除)或 Active(进入第二阶段)。
第二阶段对抗式辩论:对全部指令按可修复性(1-5)与理由质量(1-5)打分,乘积排序,取前 3 名辩论。Red 主张移除并给出具体 diff;Blue 主张保留并补充新理由、指出修复风险;White 依据证据裁决 remove、keep 或 rewrite justification。规则:双方须引用具体代码,Red 必须给具体 diff,Blue 不得重复原理由,White 裁决为最终结果。
输出:第一阶段列出 Stale 与无法验证项;第二阶段逐条给出当前代码、原理由、移除后的 lint 输出、三方论点与裁决,REMOVE 时重复 diff,REWRITE 时给出完整替换行;最后以表格汇总编号、文件行号、规则、裁决与工作量。
限制:依赖 go 与 golangci-lint;裸 //nolint 无法按具体规则验证;构建失败时只能标记无法验证;评分与辩论依赖 references/go-nolint-patterns.md 的指引。