CPG与AST、CDG、CFG、DDG、PDG

​​1. 核心定义对比​​

在这里插入图片描述

2. 代码属性图(CPG)的核心思想​​

CPG 是一种 ​​多维图结构​​,它将不同维度的代码分析结果(AST、CFG、CDG、DDG、PDG 等)融合到一个统一的图中。

​​* 核心组件​​:
​​节点​​:表示代码元素(如变量、函数、语句、控制块等)。
​​边​​:表示不同类型的关系(语法结构、控制流、数据依赖等)。
​​* 整合方式​​:
以 AST 为基础骨架,通过属性扩展添加控制流、数据依赖等边(例如:CFG_EDGE, DATA_DEP_EDGE)。
将 PDG(控制+数据依赖)作为 CPG 的子图。

3. 代码属性图与其他图的关系​​

图类型	与 CPG 的关系
AST	​​基础结构​​:CPG 的节点和语法关系直接继承自 AST。
CFG	​​嵌入为边​​:CFG 的控制流边作为 CFG_EDGE 添加到 CPG 中。
CDG	​​部分映射​​:CDG 的控制依赖关系通过 CONTROL_DEP_EDGE 在 CPG 中体现。
DDG	​​部分映射​​:DDG 的数据依赖关系通过 DATA_DEP_EDGE 在 CPG 中体现。
PDG	​​子图​​:PDG 是 CPG 的子图,包含所有控制依赖和数据依赖边。

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,开发者可以避免在多图之间切换,直接在一个模型中完成复杂分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值