| 文件 | 最后提交记录 | 最后更新时间 |
|---|---|---|
fix(tools): 审计器补齐 recv/selfCalls 索引与只读白名单;标注器定位修正 ## audit_parallel 的四个误判来源 **① indexMethods 没设 recv 和 selfCalls ⇒ 递归跟进空转** scanWritesDeep 靠 recv 组候选键、靠 selfCalls 才知道跟进谁,缺任一个 就静默漏判。handleRestart 只调 p.stopServer/startServer 两个方法, 因此被判成"只读" —— 而 stopServer 里有 p.server = nil。 (我先补了闭包那条分支的 selfCalls,误以为问题在闭包上,其实是 indexMethods 整体缺字段。) **② writePatterns 写了 ".Set(" 而 callString 收集的是方法名** p.sdk.Settings().Set(...) 是三段链,callString 返回 "Settings.Set", 永远匹配不上 ".Set("。漏判比误判更难发现:结果看着仍然合理。 → 模式改为不带括号。 **③ looksLikeExternal 用黑名单 ⇒ 纯读标准库调用全被判"可能写"** Marshal / ReadAll / NewRequest / NewReader 都不带写操作迹象,却被判写, 120 个工具里 119 个判成 SERIAL —— 等于工具没在工作,却**看上去在工作** (保守方向不会引起怀疑)。 → 改为 knownReadOnlyCalls 白名单。判定原则:**默认怀疑,明确信任** —— 写不动的东西要逐个列出来。 **④ 工具名提取打印 AST 内部结构** fmt.Sprintf("%v", a.Y) 输出 tp&{10500 10515 STRING "manage_social"}, 名字里混着指针地址,人没法核对。 → 改用 BasicLit.Value + 归一化去掉运行期前缀。 ## annotate_parallel 的插入点定位 改文本匹配改结构体字面量这条路走了三次弯: - 正则找"最后一个顶层字段"被嵌套 map 里的同形文本骗到,823 处重排改坏文件 - 变量前缀匹配没要求 RegisterTool( 在**同一行**,命中函数体里散落的字面量, 起点错到 switch case 中间,报错指向一处看起来完全无辜的分支 - 只按行末**净**深度判断:Parameters 写在单行时(进出同一行,净变化 0) 永远察觉不到曾进入深度 3,追踪一路跑到 1305 行才"收敛" → 最终按**行内峰值深度** + 记录进入深度 3 的行号判定。 ## 幂等 未标注过的工具重复跑会插入第二份 ParallelSafe(duplicate field 编译错误)。 → 加 blockHasDecl 预检。 | 17 天前 |