用 Codex 或 Claude Code 完成一次安全代码修改

难度
进阶
预计时间
90—180 分钟
输出成果
最小代码修改、测试记录、差异审查和交付说明
最后核验
2026-07-26

这节课不比较谁“写代码更强”。你会在一个模拟小项目中,用 Codex 或 Claude Code 完成同一项安全修改:先建立规则、复现错误、写验收用例,再限制修改范围、运行检查、审查差异并整理交付记录。

练习项目:修复文本统计器的空字符串行数

现有函数使用 text.split(/r?n/).length 统计总行数,空字符串会被算成 1 行。目标是让空文本返回 0,同时保持其他三个用例不变。

模拟本地项目

使用 Codex

可以在终端、IDE 或桌面应用中进入代码工作流。把项目目录、规则、测试命令和完成条件说清楚。

查看 Codex 资料与官方来源

两种工具都不能替代版本控制、测试和人工验收。使用哪个取决于账号可用性、工作入口、项目环境和同一小样的实际结果。

第一步:代理开始前,先让项目说明怎样工作

AGENTS.md项目规则、命令和禁止事项
src/counter.js待修改的统计函数
tests/counter.test.js正常与边界用例
README.md用户口径和运行方法
# 项目规则

## 目标
维护一个浏览器本地文本统计器。

## 允许修改
- src/counter.js
- 与本次错误直接相关的 tests/counter.test.js
- 如果统计口径变化,更新 README.md 对应一句说明

## 禁止
- 不增加账号、上传、保存历史或新依赖
- 不重构无关函数
- 不修改密钥、环境变量、部署配置
- 不删除用户文件或覆盖原始数据

## 验证命令
- npm test
- npm run lint

## 完成标准
- 空字符串返回 0 行
- 现有正常文本、空白行和 Windows 换行用例继续通过
- 差异中没有无关格式化和临时文件

Codex 官方最佳实践建议把仓库结构、运行方式、构建测试命令、约束和完成标准写入 AGENTS.md。其他工具即使使用不同规则文件,也应保存同样的信息。

第二步:把“修一下”改成可复现任务

错误任务

这个统计器有点问题,帮我修好并顺便优化代码。

没有输入、预期、实际结果和范围。“顺便优化”会扩大差异,增加回归风险。

可执行任务

  • 输入:空字符串 ""
  • 当前:总行数为 1
  • 预期:总行数为 0
  • 保持:"annb" 仍为 3 行
  • 范围:只改统计函数、相关测试和必要说明
目标:
项目目录:
相关文件:
复现步骤:
测试输入:
当前结果:
预期结果:
必须保持的行为:
允许修改的范围:
明确不做:
验证命令:
完成后必须返回:
1. 根因
2. 修改文件
3. 实际测试结果
4. 仍存在的限制

开始前先读取项目规则并复述理解;如果规则和任务冲突,停止并说明。

第三步:先看失败证据,再让代理改代码

1

基线

先运行全部现有检查,区分原有失败与本次问题。

2

复现

增加空字符串用例,确认它在旧实现上失败。

3

最小修复

只处理空字符串分支,不重写整套统计逻辑。

4

回归

重新运行全部用例、lint 和必要构建。

项目与版本:
基线命令:
基线结果:

复现用例:
输入:
修改前预期:
修改前实际:
失败输出:

修改后命令:
空字符串:
普通文本:
包含空白行:
Windows 换行:
lint:
构建:

失败项:
是否由本次修改引入:
证据保存位置:

允许的最小思路

function countLines(text) {
  return text === "" ? 0 : text.split(/r?n/).length;
}

这是课程中的思路示例,不应脱离真实项目直接复制。代理必须先读取现有函数、测试风格和空白字符口径。

第四步:测试通过后,仍要逐行审查差异

检查项要问的问题不通过示例
范围每一行是否直接服务本任务?同时重命名无关变量
行为是否只改变约定的边界情况?把只含空格文本也改成 0 行
测试用例是否证明错误而非迎合实现?只断言函数没有报错
安全是否出现密钥、外部发送或扩大权限?把本地内容发送到新服务
产物是否混入缓存、日志、截图和测试输出?提交 node_modules 或临时文件
任务:
审查范围:
修改文件:

□ 每个文件都在允许范围内
□ 每一行修改都能对应任务或测试
□ 没有无关重构、依赖或格式化
□ 没有密钥、个人信息和本地绝对路径
□ 没有新增网络发送、删除或公开发布动作
□ 测试覆盖修改前失败、修改后通过
□ 用户说明与实际行为一致

发现的问题:
要求返工:
返工后复测:
审查人:

最后一步:交付的是证据包,不是“已经修好”

  1. 保留修改前的失败输出和修改后的通过输出。
  2. 列出所有修改文件及其必要性。
  3. 记录实际运行的测试、lint、构建和人工操作。
  4. 确认差异中没有密钥、无关文件和扩大权限。
  5. 明确尚未覆盖的平台、输入或环境。
  6. 只有获得发布权限后才能部署、推送或公开发布。
任务:
使用工具与入口:
项目版本或分支:
修改文件:
根因:
最小修复:

修改前失败证据:
修改后通过证据:
实际运行命令:
人工检查:
差异审查结论:
未覆盖范围:
回滚方式:

□ 没有无关修改
□ 没有密钥和临时产物
□ 没有未经授权的推送、部署或发布
□ 用户可以按说明重新运行验证

交付人:
验收人:
日期:
什么时候不应该让编程代理直接修改?

当项目没有备份或版本控制、规则和测试命令未知、任务涉及生产数据库迁移、密钥、付款、删除、公开发布,或你无法审查最终差异时,先停在只读分析和计划阶段,不要扩大写入权限。


你的本机学习记录

完成练习并验收后,再标记本课

生成过一次内容不等于完成。请先按本页清单实际检查交付物。

未完成

查看完整学习路线