1. 核心定义对比
2. 代码属性图(CPG)的核心思想
CPG 是一种 多维图结构,它将不同维度的代码分析结果(AST、CFG、CDG、DDG、PDG 等)融合到一个统一的图中。
* 核心组件:
节点:表示代码元素(如变量、函数、语句、控制块等)。
边:表示不同类型的关系(语法结构、控制流、数据依赖等)。
* 整合方式:
以 AST 为基础骨架,通过属性扩展添加控制流、数据依赖等边(例如:CFG_EDGE, DATA_DEP_EDGE)。
将 PDG(控制+数据依赖)作为 CPG 的子图。
3. 代码属性图与其他图的关系
4. 代码属性图的优势
统一查询:可在单一图中同时分析语法、控制流、数据依赖等多维度关系。
- 示例:查询存在数据依赖且被某个 if 条件控制的语句
query = "MATCH (cond:IfStatement)-[:CONTROL_DEP_EDGE]->(stmt:Statement)-[:DATA_DEP_EDGE]->(var:Variable)"
* 高效检测漏洞:结合跨维度特征(如跨函数数据流 + 控制条件约束)。
* 扩展性强:可动态添加新属性(如指针别名分析、类型约束等)。
5. 实际应用示例
假设分析以下代码片段:
void foo(int x) {
if (x > 0) { // AST 节点: IfStatement
int y = x * 2; // AST 节点: Assignment
}
}
在 CPG 中的整合表示:
* AST 关系:IfStatement → Assignment(父子节点)。
* CFG 边:IfStatement 到 Assignment 的真分支边(CFG_EDGE)。
- CDG 边:IfStatement 控制 Assignment 的执行(CONTROL_DEP_EDGE)。
- DDG 边:Assignment 的变量 y 依赖于 x(DATA_DEP_EDGE)。
6. 总结
CPG 是超级图:将 AST、CFG、CDG、DDG、PDG 统一整合,形成多属性、多关系的网络。
典型工具:Joern、CodeQL 等静态分析工具的核心模型。
适用场景:漏洞检测(如 SQL 注入、缓冲区溢出)、代码优化、逆向工程。
通过 CPG,开发者可以避免在多图之间切换,直接在一个模型中完成复杂分析。