文件行号
internal/agent/unread_edit_guard.go L257-258(extractEditFilePaths 有 case "batch_replace" 死分支——门控 agent.go:3194 仅含 edit_file/multi_edit_file/multi_file_edit,grep 全仓 extractEditFilePaths 仅 3199/3276 两调用点外层门同样不含)+ L358-359(extractCreateFilePaths 含 batch_replace)+ agent.go:3099(mutatesSourceTree(tc.Name) && !result.IsError——verify_hint.go:163-168 含 batch_replace)→ 3119-3120 对每路径 recordCreated——批量修改的现存文件被标 "created"(L125-127 注释语义为"agent 本 run 新建内容自己写")→ L146+L176 filesCreated[n] { return "" } 同 run 后续 edit 同时跳过未读+过期读双检查;agent.go:1509-1510(每用户轮 reset)对照 L154 "without reading it first in this session"(会话上下文未清措辞为假;warnedFiles 每 run 重置可重发);unreachable_code_check.go L24-31(findTerminatingStmt 将 BranchStmt 含 goto 非末位视为终止——goto done; done: cleanup() 的 label 目标可达却报 unreachable——无控制流分析)+ L53-54(仅 walk *ast.BlockStmt——ast.CaseClause.Body 是 []ast.Stmt 非 BlockStmt → case 内 return 后死代码永不可见,go vet 可检);unsafe_usage_check.go L153-165(模式 3 要求 RHS 恰为 CallExpr)+ L173-201(模式 2 要求算术内联且仅 +/-)——经典两行式 off := uintptr(unsafe.Pointer(p)) + 16; q := unsafe.Pointer(off) 两半全漏——头注释 L29-31 自称对标 vet-unsafeptr 反而倒挂;unused_param_check.go L82-84(提示 "consider removing it or renaming to '_'")+ 豁免仅 _/导出/单语句 stub——接口实现(func (h *handler) Shutdown(ctx) error)参数是契约非死代码
问题
案 A(Med-High·漏报+污染):batch_replace 双重逃逸 read-before-edit 守卫
- 门控不含 batch_replace(extractor 的 case 是死分支——意图与实现脱节);同一循环把批量修改的现存文件标为 "created" → 后续 edit_file 对这些文件跳过未读+stale 双检查——agent 先 batch_replace 大量文件再 edit 其中之一零告警
修:门控加 batch_replace;extractCreateFilePaths 移除 batch_replace(或 recordCreated 改 recordWrite 语义)。
案 B(Med·误报):goto/label 前向跳转报 unreachable
- BranchStmt 非末位即终止——goto 目标 label 及其后语句可达却报——delta 门控限新增代码内触发不消除
修:LabeledStmt 目标收集+goto 目标比对(或 label 语句豁免)。
案 C(Med·漏报):两行式 unsafe.Pointer 往返全盲
- 最常见真实写法(uintptr 变量存算术后转回)两半都漏——与自称对标 vet-unsafeptr 的头注释倒挂
修:模式 3 放宽 RHS 为含 uintptr(unsafe.Pointer) 的 BinaryExpr;模式 2 追踪 Ident 到赋值。
案 D(Med·误报干扰):未使用参数建议删除——接口实现编译失败循环
- unexported 接口实现方法(Shutdown/ServeHTTP/回调适配器)参数是契约——"removing" 列第一选项误导 agent 破坏签名 → 编译失败 → 错误恢复循环
修:非破坏性选项唯一化(仅建议 _ 重命名)。
案 E(Med-Low×2)
- per-run reset 与 "in this session" 措辞矛盾——多轮"上轮读本轮编"常态吃假理由警告每轮可重发;case 体死代码结构性漏检(CaseClause.Body 非 BlockStmt walk 不入)
修:措辞改 "in this run" 或 reset 保留跨轮已读集;walk 加 CaseClause 分支。
干净项
unkeyed_struct_check:注册在位(write_integrity.go:451)/slice/array/map 不误报/嵌套省略类型不炸/1 字段豁免/delta multiset 全对——跨包同名 delta 抵消仅罕见漏报不立案;本地类型严于 vet 为附注级。四注册族条目(unsafe:415/unreachable:432/unkeyed:451/unused-param:457)全验在位——非 #1514/#1516/#1518 死火类。
排除
#1442-#1519 各案;write_file 盲区为 header 明示设计;checkUnreadEdit 事后 advisory 设计如此。
严重程度
Med-High + Med×3 + Med-Low×2
独立复核确认:6/6 属实——三门控原文+两调用点 grep+created 污染链、reset/措辞原文+降级、BranchStmt/LabeledStmt 推演、CaseClause 结构+go vet 对照、两模式断言倒挂、豁免集+破坏性建议推演。
文件行号
internal/agent/unread_edit_guard.goL257-258(extractEditFilePaths 有case "batch_replace"死分支——门控 agent.go:3194 仅含 edit_file/multi_edit_file/multi_file_edit,grep 全仓 extractEditFilePaths 仅 3199/3276 两调用点外层门同样不含)+ L358-359(extractCreateFilePaths 含 batch_replace)+ agent.go:3099(mutatesSourceTree(tc.Name) && !result.IsError——verify_hint.go:163-168 含 batch_replace)→ 3119-3120 对每路径 recordCreated——批量修改的现存文件被标 "created"(L125-127 注释语义为"agent 本 run 新建内容自己写")→ L146+L176filesCreated[n] { return "" }同 run 后续 edit 同时跳过未读+过期读双检查;agent.go:1509-1510(每用户轮 reset)对照 L154 "without reading it first in this session"(会话上下文未清措辞为假;warnedFiles 每 run 重置可重发);unreachable_code_check.go L24-31(findTerminatingStmt 将 BranchStmt 含 goto 非末位视为终止——goto done; done: cleanup()的 label 目标可达却报 unreachable——无控制流分析)+ L53-54(仅 walk*ast.BlockStmt——ast.CaseClause.Body 是 []ast.Stmt 非 BlockStmt → case 内 return 后死代码永不可见,go vet 可检);unsafe_usage_check.go L153-165(模式 3 要求 RHS 恰为 CallExpr)+ L173-201(模式 2 要求算术内联且仅 +/-)——经典两行式off := uintptr(unsafe.Pointer(p)) + 16; q := unsafe.Pointer(off)两半全漏——头注释 L29-31 自称对标 vet-unsafeptr 反而倒挂;unused_param_check.go L82-84(提示 "consider removing it or renaming to '_'")+ 豁免仅_/导出/单语句 stub——接口实现(func (h *handler) Shutdown(ctx) error)参数是契约非死代码问题
案 A(Med-High·漏报+污染):batch_replace 双重逃逸 read-before-edit 守卫
修:门控加 batch_replace;extractCreateFilePaths 移除 batch_replace(或 recordCreated 改 recordWrite 语义)。
案 B(Med·误报):goto/label 前向跳转报 unreachable
修:LabeledStmt 目标收集+goto 目标比对(或 label 语句豁免)。
案 C(Med·漏报):两行式 unsafe.Pointer 往返全盲
修:模式 3 放宽 RHS 为含 uintptr(unsafe.Pointer) 的 BinaryExpr;模式 2 追踪 Ident 到赋值。
案 D(Med·误报干扰):未使用参数建议删除——接口实现编译失败循环
修:非破坏性选项唯一化(仅建议
_重命名)。案 E(Med-Low×2)
修:措辞改 "in this run" 或 reset 保留跨轮已读集;walk 加 CaseClause 分支。
干净项
unkeyed_struct_check:注册在位(write_integrity.go:451)/slice/array/map 不误报/嵌套省略类型不炸/1 字段豁免/delta multiset 全对——跨包同名 delta 抵消仅罕见漏报不立案;本地类型严于 vet 为附注级。四注册族条目(unsafe:415/unreachable:432/unkeyed:451/unused-param:457)全验在位——非 #1514/#1516/#1518 死火类。
排除
#1442-#1519 各案;write_file 盲区为 header 明示设计;checkUnreadEdit 事后 advisory 设计如此。
严重程度
Med-High + Med×3 + Med-Low×2
独立复核确认:6/6 属实——三门控原文+两调用点 grep+created 污染链、reset/措辞原文+降级、BranchStmt/LabeledStmt 推演、CaseClause 结构+go vet 对照、两模式断言倒挂、豁免集+破坏性建议推演。