CFG:程序不是一条线,而是一张路网
TL;DR
从 if、循环和异常开始理解控制流图,以及它如何帮助 AI 编程发现遗漏分支。
控制流图 CFG 把条件、循环和异常路径画成程序路网,帮助理解 AI 调试、分支覆盖与静态分析。

CFG:程序不是一条线,而是一张路网
代码从上到下排列,但运行时并不一定从第一行走到最后一行。if、for、while、异常和提前返回都会改变路线。CFG,也就是 Control-Flow Graph,控制流图,就是用节点和边表示程序可能执行路径的一种模型。
节点和边分别是什么
控制流图中的节点通常是基本块:一组连续执行、不会从中间跳入或跳出的指令。边表示执行可能从一个基本块走向另一个基本块。一个 if 会产生至少两条分支,循环则会形成回边,表示程序可能回到之前的节点。
这张图能回答许多单纯看文本不容易回答的问题:某行代码是否可达?某个异常处理是否永远不会触发?一个分支是否从未被测试?函数退出前是否所有路径都返回了值?
AI Agent 为什么需要路径视角
AI 常见的修复方式是看到一个报错就改附近几行,但真正的原因可能在另一条路径上。例如模型为一个变量补了默认值,却没有注意到另一个分支会绕过初始化;或者它只修复了正常流程,遗漏了超时和异常流程。控制流图能把“可能怎么走”显式化。
对 AI 生成测试来说,CFG 也很重要。测试不只是覆盖函数名,更要覆盖分支和边。一个测试套件即使调用了每个函数,也可能始终只走成功路径。覆盖率工具常通过对基本块和边进行插桩,记录真实执行过的路线。
CFG 和业务流程不是一回事
控制流图表达的是程序执行可能性,不代表用户实际会怎样操作。某条路径在语法上可达,不等于业务上允许;某条异常路径很少触发,也不等于它不重要。AI 仍然需要产品规则、输入约束和真实场景来判断优先级。
普通开发者可以怎样使用
让 AI 修复复杂 Bug 时,可以要求它先列出触发问题的完整路径:输入从哪里来,经过哪些条件,在哪个节点出错,修复后哪些分支需要补测。这样做会迫使模型从“改一行”转向“解释一条路”。
关于基本块、边和覆盖率插桩,可以参考 Clang SanitizerCoverage 文档。



