资讯动态

AI代码审计交叉验证:Claude Code与Codex的实战对比

发布时间:2026/9/14 16:16:18 来源:尧图企业网站定制
先说结论我把一个内部系统的8个核心模块同时丢给 Claude Code 和 Codex 做代码审计要求它们各自输出一份“高危问题清单”。结果两个工具只在4个模块上给出了完全一致的结论。剩下4个模块要么是发现的问题类型完全不同要么是同一个问题两边给出的修复建议南辕北辙。这不是一篇论文式评测而是我把两个工具按到真实项目里“搬砖”的记录。整个过程包含了实验条件如何控制、审计结果怎么交叉验证、分歧为什么会发生、以及最后我如何把这两份报告拼成一份能落地的问题清单。这篇东西适合谁看如果你正在用 AI 做代码 review、想搞清楚 Cursor 和 Claude Code 这类工具到底靠不靠谱、或者你自己也有两个 AI 工具不知道该信谁——那这篇内容能帮你省掉不少试错时间。1. 为什么搞这场“双 AI 对审”AI 审计的置信度困局1.1 单个 AI 工具审计的信任盲区先说背景。我所在的小组维护着一个偏传统的老系统技术栈是 Java 8 加上一部分 Python 服务端模块之间耦合度不算低。最近要做一个大版本升级领导层要求把安全性、资源泄漏、异常处理这类问题先扫一遍。放在以前这是一项需要人肉翻代码的苦差事。现在有了 Claude Code 和 Codex 这类能读代码库的 AI 工具自然会想让它俩帮我筛一遍我再人工复核。但这里有个很实际的痛点AI 工具在代码审计这件事上存在“确定性缺失”。同一个问题你问 GPT 三次能得到三个不同答案放到代码审计场景就意味着两个不同的模型可能得出不同的漏洞判断、不同的严重性评级、不同的修复建议。问题来了听谁的单独让一个工具出报告我永远不知道它漏了什么、误报了什么。除非我对这份报告里的每一项都做人工复核可一旦到了人工复核这个环节用 AI 提效的意义就被削弱了大半——因为我需要的不是“帮我查”而是“帮我查的同时告诉我哪里需要重点关注”。这是个先有鸡还是先有蛋的矛盾。1.2 双工具交叉审计的思路所以我想了一个笨办法既然单个工具的输出有置信度问题那就用两个互补的工具对着审计。规则是死的两个工具都被要求对同一个代码库、用同样的规则、输出同样的报告格式。如果两个独立模型都在同一处报了问题——这个问题的可信度就直线上升因为它不太可能是单模型的随机幻觉。反过来如果一个工具报了另一个没报说明那里要么藏着一个需要人工关注的边界 case要么是某个模型产生了误报。这个思路借鉴了一个老概念冗余容错。飞机的航电系统用多套传感器交叉校验不是因为它认为单个传感器会坏而是因为一旦单个传感器坏了没有一个客观的对照你根本分不清它是“读数错了”还是“真相如此”。AI 代码审计的处境恰好一样。1.3 选模型的理由为什么是 Claude Code 和 Codex选 Claude Code 和 Codex 没有太多玄学更多是现实考量。Claude Code 在长上下文代码理解上表现相当稳尤其适合处理那种跨文件的数据流追踪——顺着一个方法的调用链从一个 service 追到另一个 mapper 再追到 SQL这种活儿 Claude Code 的表现往往让人惊喜。Codex 在代码相关的任务上更“工程化”对异常路径、边界条件这类细节的嗅觉比较敏锐。两个模型的设计理念、训练数据的侧重、指令遵循的方式都不太一样正好构成一组对照。另外一个很现实的原因是这两个工具我在日常开发里都用得不浅对它们的脾气摸得比较清楚。你让一个新手拿着工具和让一个了解工具底细的人拿着工具产出报告的姿势是完全不同的。想让它俩做对照组前提是我知道怎么跟它们沟通。2. 实验的“手术条件”模块划分、环境约束、Prompt 设计既然要做对照实验就得把一切可能引入偏差的变量控住。有几个关键的实验条件我觉得值得展开说说。2.1 如何把系统拆成模块又避免上下文污染我选了一个体量适中的服务包作为实验对象。这个系统大概是 18 万行代码如果直接把整个仓库丢给 AI 让它“帮我看看哪里有问题”效果一定很差。原因很简单上下文窗口塞不下工具只能在局部代码里打转根本谈不上全局审计。所以我做了模块切分。我不是按目录结构切而是按“业务域调用链边界”切。我画了一张大致的调用关系脑图然后把系统切成 8 个高内聚的模块会话管理、数据导出、权限校验、配置中心、日志采集、异步任务调度、外部 API 聚合、静态资源托管。这 8 个模块基本覆盖了不同类型的问题场景有高并发的、有涉及文件操作的、有跟外部系统交互的、有做权限校验的、有跑定时任务的。这样设计其实是在潜意识里为“什么类型的问题容易被 AI 发现或遗漏”这个研究点做了分桶。这里要强调一点我递给两个工具的不是裸代码目录而是一个约束了审计边界的上下文包。每个模块我会做一个“代码快照”——只打包该模块相关的源文件再附上一份模块说明文档写明这个模块的功能、主要入口类、数据流向、依赖的关系。这样工具在审计时不会被无关目录里的代码干扰能聚焦在模块本身的逻辑上。实测下来给不给这份说明文档对最终报告质量的影响远大于你用的模型本身。2.2 Prompt 模板怎么让两个工具说“同一种语言”实验能不能成立很大程度上取决于 Prompt 的标准化程度。如果我用两种不同的描述去问两个工具得到的差异根本无法归因于模型能力——可能是 Prompt 表达方式的差异导致的。所以我提前写死了一个统一的审计指令模板。模板的核心内容分四层第一层是角色定义告诉它“你是一名资深代码审计专家”第二层是任务描述明确“审计指定模块识别安全漏洞、资源泄漏、并发问题和异常处理缺陷”第三层是输出格式约束要求它“对每个发现给出严重程度评级高/中/低、问题类型、代码位置、问题描述、修复建议”第四层是规则约束“只报告确定的问题不确定的不要写入报告”。这一层其实很关键。如果你不对输出格式做约束让 AI 自由发挥它很容易给出一堆“看起来有价值的废话”。但你对格式约束得越严格AI 在报告里的“幻觉空间”就越小——它得对每个发现给出具体的文件、行号、建议代码。这就强迫它必须基于真实代码进行分析而不是泛泛而谈。2.3 同一个仓库的分支状态、依赖版本锁定另一个容易出问题的环节是代码状态的一致性。两个工具审计的必须是同一份代码——这不废话吗但实际上非常容易翻车。我一开始在本地跑的是工作分支上面有大量未提交的改动。如果拿这个状态丢给 Claude Code再拿另一个状态丢给 Codex两边看到的代码就完全不一样了。所以我在实验前做了个干净的分支。从主干打了审计分支刻意不包含近期未上线的重构代码同时把版本号、依赖描述文件都锁定。我把模块快照打进 tar 包的时候还做了 hash 校验确保两个工具拿到的每一个字节都是相同的。细节做到这个份上做出来的对比才有意义。Prompt 我贴一下核心部分你是一名资深代码审计专家。请审计以下模块的源代码解压到 /workspace/module 目录下重点检查 - 安全漏洞注入、越权、敏感信息泄漏等 - 资源泄漏连接、文件流、线程未释放等 - 并发问题竞态、死锁、共享可变状态等 - 异常处理缺陷吞异常、错误传播路径断裂等 请以 JSON 数组格式输出报告每个元素包含 - severity: high | medium | low - category: 问题类型 - location: 相对路径 方法名/类名 行号 - description: 问题描述说明为什么它是问题 - suggestion: 修复建议代码或思路两个工具都严格使用同一份 Prompt 文本唯一变量就是模型本身。2.4 执行环境的统一同一个容器同样的内核参数工具运行的宿主环境如果不一样也可能影响输出——比如一个在容器里、一个在本地 shell 里工具拿到的代码路径、运行权限都不同。所以严格起见我用同一个容器镜像起了两个隔离环境。借助容器化能确保文件系统布局一致、用户权限一致、执行超时一致。有了这个前提最后如果它们给出不同的结论那就只能归因于模型的判断差异而不是“一边能读某个文件另一边读不到”。顺带提一下别在审计过程中去打断它。比如看到 Codex 在某处卡住了你手工改了个环境变量让它继续——这就会引入额外的变量最后的结果也没法作为对照了。让它自己跑完当然要是中途因为模型自身问题崩了那这一组数据只能作废。3. 审计结果的剪刀差8 个模块的共识与分歧分布审计跑完之后回收了两份 JSON 报告。我做了一个简单的归一化处理——把两边的发现按模块聚合剔除掉纯格式差异然后按“问题类型文件位置”对齐手工比对。比对结果如下表。模块Claude Code 发现问题数Codex 发现问题数两边共识数仅有 Claude仅有 Codex会话管理65421数据导出57324权限校验43310配置中心35124日志采集54321异步任务调度76432外部 API 聚合46224静态资源托管23201先看共识区。有 22 项被两边同时报出——这类问题通常有着非常明确的代码特征比如直接拼 SQL 字符串、catch 块里只是打个日志然后继续返回 null、共享的 SimpleDateFormat 静态变量在并发调用下使用、连接没有放到 finally 里关闭。这些问题是 AI 审计的“基本面”也是让我对两个工具最有信心的部分。共识区里不少是高危问题修复价值很大。严重性评级两边不完全一致有的 Claude 标 high、Codex 标 medium但核心事实——问题存在、位置一致——是统一的。我自己的判断是凡是两个工具都报的问题基本都可以直接进入修复队列不需要太多额外的复核。真正的分歧出现在单边报告里。如果只有一个工具报出来情况就得看第二个模型为什么没报。动手验证这些分歧是一个又耗时又长见识的过程。有的单边发现确实是误报比如 Codex 把某个不共享的可变对象当成了跨线程共享但也有好几个单边发现是真问题而且是有一定隐蔽性的问题——另一边的模型压根没追踪到。4. 分歧解剖两个具体模块的对比复盘4.1 数据导出模块Codex 赢了数量Claude 赢了准确率数据导出模块的分歧特别典型。这个模块的功能大致是用户发起导出请求后台把数据库数据查出来转成 Excel 或 CSV存到临时目录然后通过异步通知给下载链接。Claude Code 在这个模块上报了 5 个问题Codex 报了 7 个共识 3 个。单独看数量似乎 Codex 更“勤奋”。但在人工复核时我发现Codex 多报的那 4 个里有 3 个是误报。有一个它认为“把路径字符串直接拼到文件名里会导致目录穿越”可实际代码在拼接前已经做了规范化替换风险极低。还有一个它认为“导出大量数据时 OOM”但那个查询走的是游标式的流式读取并不会一次性加载到内存。这说明了几个问题。第一它识别到了“文件名拼接”这种风险模式但没能验证代码中的缓解措施是否存在——这是 AI 审计目前普遍的一个特点模式识别能力很强上下文验证能力偏弱。第二对于流式读取这种习惯Codex 的理解不够准确——它可能只看到了一个通用的查询方法没有追踪到具体打开游标的 SQL 是在流式模式下执行的。作为对照组Claude Code 在同一个模块报的问题虽然少 2 个但准确率要高很多。多报的两个问题里一个是 PDF 导出时字体文件流未关闭——这是个小问题但确实存在另一个是导出的临时文件权限设置过宽建议改成用户私有权限。这两个问题 Codex 都没报。这就很能说明差异Claude Code 对资源句柄的追踪更细腻而 Codex 更倾向于在常见安全模式上做大量规则匹配——它能看到典型的风险形态但在需要“顺着代码逻辑验证一层”的任务上稍逊一筹。4.2 配置中心模块两边分歧最大共识最少配置中心模块是整个实验里分歧最大的Claude Code 报了 3 个问题Codex 报了 5 个两边只共识了 1 个——可以说基本属于“各说各话”。我人工通读了这个模块的代码核心逻辑是启动时将远程配置拉取到本地缓存文件应用运行时从缓存读配置同时监听远程变更事件增量更新本地缓存。这个模块同时涉及文件 IO、线程池、并发读写三个高风险区。Claude Code 报的问题之一是“配置热更新时缓存没有加锁存在原子性隐患”——它把注意力集中在内存缓存的并发语义上认为在这个场景下缓存更新不是一个原子操作读线程可能在写入过程中读到半个配置。这个判断说实话有一定道理但代码里 Update 方法的赋值都是单引用替换JVM 的引用赋值本身就具备原子性所以这个问题的实际严重程度并没有它标的那么高。Codex 报了一个“配置服务初始化时忽略了解析失败异常导致错误配置被悄悄缓存”的问题。这个反而是个有价值的问题——真实场景下配置中心很容易出现网络抖动如果解析失败被 catch 掉继续用旧缓存应用可能长时间运行在一个过期的配置下而不自知。这类问题通常不会被静态代码分析规则匹配到因为它依赖的是对“配置中心拉取语义”的领域理解。这两边的差异其实反映了两个模型的内置知识侧重不同。Claude Code 对并发语义更敏感Codex 对“系统的韧性”更敏感——它更关注异常后的容错路径、故障转移、是否需要告警这类工程层面的东西。4.3 外部 API 聚合模块脆弱的外部依赖如何触发不同的判断外部 API 聚合模块主要是把多个第三方接口的数据统一封装成本系统模型。这个模块里 Claude Code 报了 4 个问题Codex 报了 6 个共识只有 2 个。我在对比时发现最有趣的一个分歧是Claude Code 报了一个“API 调用超时时间不统一个别场所甚至没设超时”Codex 完全没提而 Codex 报了一个“第三方接口返回值的类型转换太信任上游可能 NPE”Claude Code 也没提。后来我回头看代码发现两个都有道理。超时问题确实存在——不同的外部调用处用了不同的 HTTP 客户端有的设置了 5 秒超时有的直接用了默认可能更长的值。NPE 风险也属实——上游服务返回的 JSON 里某些字段可能为 null在转换时没做判空就直接拆箱。这俩问题代表了审计视角的差异Claude Code 更像是在做“运行行为工程分析”Codex 更像是做“防御性代码审查”。还有个有意思的细节这类“第三方调用 数据转换”的模块两个工具都对它特别敏感。我觉得原因是这个形态的代码问题特征非常明确比如超时配置、异常捕获、类型转换这些都是模型训练数据里出现频率极高的模式。给我一个数据点在审计这类模块时AI 的综合能力是不亚于一个中级工程师的后者可能还会遗漏一些模式匹配类型的检查点。5. 分歧根源剖析模型结构、上下文策略与报告可信度5.1 为什么同一个代码库会产出不同的“事实”两个工具看的是同一份代码为什么结论会有这么大的偏移我自己的体会是模型天然是不同的归纳偏置体。Codex 是在海量代码补全和修改数据上训练的它的强项是“看到某个模式后联想到最常见的后续代码”。所以做缺陷检测时它更像是“我在大量代码里见过这种写法这通常会导致问题”——这是频率论者。而 Claude Code 的训练更侧重长文推理和指令跟随它在分析代码时更像在“一小步一小步地论证每个路径”更像贝叶斯式我不只是看这个模式常见不常见我要结合上下文修正先验判断。这个区别放到审计场景。一个偏“模式匹配”的模型在参考代码语料里可能撞见过“输入流未关闭”这类 bug所以它对类似代码给出提醒的倾向性很强而一个偏“逻辑推理”的模型可能在同一个位置判断“虽然这里没有显式关闭但调用链末尾有统一的资源释放器”于是选择不报。还有一点是上下文利用策略。两个工具在长代码上下文里做审计时对“注意力”的分配不一样。某个模块里有一段非常显眼的全局共享变量可能一个模型的大部分注意力都锁定在这一段反复推导它带来的并发影响另一个模型却把这段当作“既有事实”看转而花了大量推理步骤去追踪某个调用的返回路径。这直接决定了它在报告里写什么。5.2 共识区一定可靠吗单边区一定可疑吗我做实验前本来有一个预判共识问题可以无脑采纳单边问题逐个验证。但实验做完后这个预判得到了一定修正。共识区的问题实际上是“两个模型用不同的归因逻辑指向了同一个事实”。这种情况通常意味着问题有很强的代码级证据不是臆测。但也有极少数特例两边都中招于同一个“假模式”。比如某个问题表面上和业界常见反模式一模一样但本项目里这段代码在上一层有专门保护。两个模型都只看局部没看全局于是双双误报。不过这种情况比例很低在我这次的实验里出现过一次是权限校验模块里的一个“看起来像越权”的问题后来排查是同一租户内的数据隔离设计原本就允许这种访问。单边区的情况更值得玩味。我原本默认只有一边报的问题可信度要打折扣但复盘下来发现单边报告里确有 30% 左右的误报但剩下 70% 是真的问题只是另一边恰好没追踪到那条路径。尤其是在“对上下文深度依赖”的问题类型上单边报告的命中率反而高——因为如果一个模型的追踪能力强到能发现一个隐蔽问题它对代码的理解已经在那个局部超越了另一个模型。5.3 修复建议的质量差异这个维度很关键除了问题本身的差异还有一个维度是我一开始忽略了、但最后觉得很关键的——修复建议的质量。同样是报一个问题两边的修复建议有可能完全不同。举个具体例子异步任务调度模块里有一个使用SELECT ... FOR UPDATE悲观锁控制并发消费的问题。Claude Code 的建议是“改用乐观锁减少锁竞争”Codex 的建议是“保留悲观锁但是缩小锁粒度把锁的范围从整个任务表缩到单条任务记录”。这两种方案不是对错关系而是取舍关系。乐观锁在冲突率高的场景下反而会放大性能问题而缩小锁粒度其实是在不改变锁策略的前提下做优化。单看建议文本都正确但在真实场景里的可执行性差异很大。所以结论是如果你让 AI 只报告问题不报修复建议你会损失很大一块价值如果你让 AI 同时输出建议你会得到双倍的建议——而“双倍建议需要人工再把它合成一个方向”。我是这么处理的先看两边建议的共同点作为修复原则再看不同点用人力判断哪个更适合当前项目的技术约束。最后只有 2 个问题的修复方案采用了分歧中的某一方其余大多取了两边的交集。6. 两轮复核后我真实采信了什么把报告合并成行动清单6.1 人工复核的优先级排序与交叉验证方法论拿到两份报告之后我做了两轮人工复核。第一轮快速过滤。我对照报告里的问题位置去读代码先确认它是不是真的存在只做“存在性验证”。这一轮过滤掉了约 20% 的误报——大部分是上面提到的“模式匹配到了、但是没验证缓解措施”的情况。第二轮深度定位。对确认存在的问题去追踪调用链判断实际触发条件、影响范围、修复难度。这一轮里我发现了几个更深的问题比如某个单边报出的“线程池满了之后任务丢弃”问题上实际的触发条件比报告中说的复杂得多——不是因为并发量高而是因为一个上游接口偶尔返回慢拖了整个队列。最后我把所有真问题按严重程度排了序生成了修复清单。具体数据是确认存在的真实问题 28 项其中高危 9 项、中危 12 项、低危 7 项。高危问题主要分布在会话管理、异步任务调度和数据导出三个模块——这个分布和人类工程师的直觉基本一致涉及共享状态、涉及外部交互、涉及资源生命周期的地方就是 bug 最容易藏身的地方。6.2 两张 AI 报告叠加后的净收益与其二选一不如取并集如果非要给出建议我的结论是不要用两个工具做“交叉验证然后只取共识区”那样做等于人为放弃了大量真问题。正确的姿势是把两份报告取并集然后按共识区和单边区分别用不同的审慎度去复核。在这个项目里共识区的 22 项里有 19 项最终确认是真问题单边区的 40 项里有 28 项也是真问题。也就是说如果你只信共识区你会漏掉接近 60% 的真问题。这个数字对我自己也是一个很大的提醒——我在实验初期的假设是错误的我以为共识才是黄金标准但真实世界里的共识率其实远低于人类工程师的协作共识率因为模型间的归纳偏置差异太大。真正有价值的东西不是“哪个模型准”而是“在组合使用两种不同偏置的审计器后人类复核应该把重点放在哪些地方”。共识区直接进入修复队列单边区需要逐项核查两边都对同一段代码给出了建议、但建议彼此矛盾的优先做人工分析——这种矛盾往往就是代码里最复杂、最需要人思考的部分。6.3 对“AI 时代代码审计”这件事的重新理解这场实验做完我对“AI 审计”的理解发生了一些变化。一开始我以为这是一场“机器替代人”的演练做完了才意识到其实是“机器辅助人的注意力分配”。大语言模型靠的是模式补全与概率联想它本质上是在从训练数据中找一个“最像出问题”的位置然后触发告警信号。它没有运行时数据没有线上监控指标也没有真实的调用链 trace。换句话说它是在“读代码”做静态审计而不是在“运行系统”做动态诊断。这意味着 AI 能承担的审计职责是帮你快速圈出一个“高危区域”把有限的人力从海量代码里解放出来集中到 AI 标记的问题上做深度复核。而真正判断“要不要改、怎么改、对什么业务有影响”的仍然是人类。人机协作的理想分工是AI 用它的模式识别能力做粗筛人做语义层面的判断与取舍。回看这个项目如果没有 Claude Code 和 Codex 的先期审计我一个人在这 18 万行代码里扫出这些高危问题大约需要两周到三周时间。而有了 AI 报告做底我只用了不到四天就把全部真实问题确认完。净收益是非常清楚的。未来的 AI 代码审计工具还会沿着更长上下文、更强推理的方向演化但很长一段时间里它的定位依然是一套非常靠谱的“问题探测器”而不是“决策器”。7. 给想复现这套实验的人的三个避坑建议如果你也想在自己的系统里复现一次类似的“双 AI 对审”我有三个实操层面的建议都是踩过坑之后得出来的。7.1 建议一控制可变量时刻记得你在做实验要做对照就要把一切能控的变量全控住。代码版本、模块范围、提示词模板、运行环境、输出格式——每一个“看起来不重要”的条件最终都可能变成你解释不清差异时的罪魁祸首。拿代码版本来说审计过程中如果有人往分支里推了一个改动你会得到一份“混合了新旧代码”的报告。我的建议是做实验的机器上只保留隔离出来的审计分支确认审计范围内没有未提交的改动并通过 hash 校验保证两个工具看到的代码字节级一致。Prompt 更要写死连标点符号都别改。运行环境我建议用容器直接固定不要在本地跑一个、在云主机上跑另一个——哪怕你以为这些差异不影响结果一旦出现分歧就说不清了。7.2 建议二先定义“共识”的口径再开始对比什么算共识、什么算分歧这一点如果不在开始前定义好后面对比的时候会陷入无穷的争论。我采用的口径是问题定位到同一文件同一函数、问题类型归类到同一大类安全/并发/资源/异常、严重性评级允许跨一级差异——算作共识。如果两个工具报的是同一个函数的两个不同问题但一个认为是 SQL 注入、一个认为是参数校验缺失我按分歧处理。定口径的作用不只是统计方便更重要的是它逼着你去思考我到底想对比什么是想对比“找问题的能力”还是想对比“对问题严重程度的判断”这两种目标对应着不同的对齐规则。我选择了一种偏宽的口径把歧义留到人工复核阶段解决。你的口径应该根据自己目的来确定但一定要先定再跑不要后补。7.3 建议三把 AI 报告当“待验证线索”不要当“事实清单”最后一条也是最重要的一条无论在实验里 AI 报告的质量多高都不要直接把报告丢给团队去修。AI 报告是一份高质量的问题线索清单不是权威的结论清单。因为 AI 没有运行时数据它不知道这个问题是不是被框架层兜底了。比如我们系统里有一个异步任务任务执行失败没被捕获AI 报了“线程中断未处理”。但它不知道我们用的是自定义的调度框架所有异常在框架层有一条兜底日志和告警链路——所以这个问题的影响远没有报告中描述的那么严重。这种“静态代码里有问题、运行时机制恰好兜住了”的情况在大型系统里非常常见只靠 AI 报告根本看不出来。所以最终落地流程应该是先让 AI 筛选出候选问题然后让对系统了解最深的人去读代码、排查运行时逻辑最后确认这个问题是真实存在的、还是被某个隐式机制兜底了再决定是否修复以及如何修复。这一步不可省也是整个流程里最需要人工智慧的地方。7.4 最后说点跑完实验后我自己的想法我上一次用纯人肉方式做系统审计已经是两三年前的事了当时一堆人围着代码一天天看靠的是资历和经验去猜哪里会有问题。现在打开终端起两个 AI agent 帮你在代码里翻滚你手里相当于多了两个不知疲倦的、各自带一套思维方式的初筛员。你需要做的只是配备好审计条目然后对它们的输出做判断。工作强度下降了但判断力的要求反而提高了。对我的日常工作来说现在的偏好是用这个组合打法去处理一切代码 review 任务先用 Cursor/Claude 跑粗筛再定期做一次大量模块的深挖——把高层级的自动扫描和人工重点复核穿插在一起效率最高。如果你没有一个称手的代码审计流程这套双模型交叉验证的方法已经替你趟开了前半条路。剩下的另一半还是得靠你对自己系统的理解去完成——毕竟没有任何一个模型比你更懂你代码里的那些“隐式约定”。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价