CPG:把代码变成一张可以查询的关系图

TL;DR

从 AST、控制流和数据流出发,理解代码属性图为什么适合大型项目分析和 AI 编程。

代码属性图 CPG 把语法、控制流、数据流和调用关系放在同一张图中,帮助 AI Agent 理解大型代码库。

CPG:把代码变成一张可以查询的关系图

CPG:把代码变成一张可以查询的关系图

代码属性图,Code Property Graph,简称 CPG,是一种把程序表示成图的数据结构。它不只记录语法树,还可以把控制流、数据流、类型、函数调用和其他分析结果放到同一张图里。对大型项目来说,这相当于把“代码长什么样”和“代码之间怎样发生关系”放进一个可查询的地图。

为什么一棵树还不够

AST 很适合表达嵌套结构:一个函数包含哪些语句,一个调用包含哪些参数。但安全问题和大型重构往往跨越多个维度。我们可能需要同时知道:某个 HTTP 参数来自哪里,经过哪些函数,在哪个条件分支中被处理,最后传给哪个文件操作。

CPG 用节点表示方法、变量、调用和控制结构,用带标签的边表示包含、调用、流向和其他关系。分析工具可以在图上做查询,例如寻找“外部输入经过若干函数后到达危险调用”的模式。

它和 AI 编程有什么关系

AI Agent 需要在大仓库中选择上下文。全文搜索很快,但容易把同名符号、无关示例和旧实现混在一起;CPG 这类结构化表示可以帮助工具沿着调用关系、类型关系或数据流关系扩展上下文。模型看到的不是一堆文件,而是一组与当前问题相连的代码片段。

CPG 也可以用于审查 AI 生成的代码。模型说“我没有改变安全边界”时,图查询可以比较改动前后的输入到危险点路径。模型说“这个函数没有调用者”时,工具可以用图中的调用关系核对。

代价和边界

建立图需要解析代码、处理语言差异,并维护索引。动态语言、反射和运行时生成代码会让图不完整。图查询也只能根据已经建模的关系工作,不能代替人工理解业务目的。

普通人如何理解

可以把 CPG 想成“代码的交通地图”:AST 是街道形状,控制流是行车路线,数据流是货物运输,类型和调用关系是道路标签。AI 可以看地图更快找到路,但地图不等于城市里的真实生活。

CPG 的结构定义和查询思路可参考 Code Property Graph Specification

KEEP READING