(智能合约实习)如何将程序的 CFG 图转换为 SimGNN 的数据格式

85 阅读3分钟

如何将程序的 CFG 图转换为 SimGNN 的数据格式

SimGNN 模型的数据格式包含两个主要要素:graphlabels。在将控制流图(CFG)转换为 SimGNN 可接受的 JSON 格式时,需要从 CFG 中提取出这两部分信息。以下是具体的构建步骤和标签特征的详细说明。

数据格式构建步骤

1. 构建 graph

graph 表示基本块(节点)之间的连接关系。可以通过遍历基本块,为每个基本块分配一个唯一的序号,并根据控制流结构连接基本块,构成图的边列表。

实现方式
  • 遍历 CFG 中的每个基本块,为其分配一个唯一的序号,作为节点标识。
  • 按照控制流结构添加边,以建立基本块之间的连接关系。

2. 构建 labels

labels 用于表示每个基本块的特征,通常可以反映基本块的性质。可以通过以下几种方式来构建标签,以便模型更好地识别和分析基本块的特征。

基本块类型分类

根据基本块的类型进行标签分类:

  1. 入口块(Entry Block):函数的起始基本块。

    • 标签值:0
  2. 出口块(Exit Block):函数的结束基本块。

    • 标签值:1
  3. 条件分支块(Conditional Block):包含条件跳转指令的基本块。

    • 标签值:2
  4. 循环头块(Loop Header Block):循环结构的起始基本块。

    • 标签值:3
  5. 其他块:不属于以上类别的基本块。

    • 标签值:4
其他标签特征

除了基本块的类型标签,还可以通过以下特征进一步丰富 labels 信息,增强模型的区分能力。

1. 基本块内指令数量
  • 定义:使用基本块中包含的指令数量来表示其复杂度。指令数量越多,复杂度越高。
  • 实现:将基本块的指令数量直接作为标签值。例如,包含 5 条指令的基本块标签为 5
2. 指令类型分布
  • 定义:统计基本块内不同类型指令的数量(如算术运算、逻辑运算、内存访问等),作为指令的分布特征。
  • 实现
    • 针对每个基本块,统计各类指令的数量,生成一个分布向量,例如 [算术=3, 逻辑=1, 内存=2]
    • 可以将这个向量平坦化,作为节点的特征标签(例如 [3, 1, 2])。
  • 应用:该分布可以反映基本块的操作类型,帮助模型识别基本块的功能。
3. 基本块的深度或层次
  • 定义:标记基本块在控制流图中的层次位置,以显示其在程序结构中的相对深度。
  • 实现
    • 计算每个基本块到入口块的最短路径长度,将该长度作为标签值。例如,从入口块到某基本块的最短路径长度为 2,则标签为 2
  • 应用:深度标签可以帮助模型理解基本块在程序执行流程中的位置,识别逻辑层次。

总结

通过上述方式提取 graphlabels 信息,可以将 CFG 转换为符合 SimGNN 数据格式的 JSON 文件。这种转换方式能够最大程度地保留程序的控制流特征,提升图相似性分析的准确性。