代码切片方法

代码切片方法
foresta.yang程序切片
软件漏洞主要由指针、数组、表达式运算、敏感 API 函数所在位置引入, 并称其为漏洞关注点。 如常见的数组越界、整数溢出、空指针、API 函数错误使用等类型漏洞, 均由以上 4 类漏洞关注点所致. 在程序代码中, 与漏洞关注点存在数据依赖或者控制依赖关系的语句集合构成一个可能存在漏洞的程序切片;反之, 其他语句被视为会干扰模型训练的漏洞无关语句. 不同于 Li 等人[19]构 造的文本切片, 本文提取程序依赖图的子图作为切片, 即选取上述 4 类漏洞关注点作为程序切片的基准点后, 保留与其存在数据及控制依赖关系的节点和边, 以生成程序依赖图子图. 具体来说, 生成代码切片可以分为 3 个步骤.
(1)漏洞关注点选取,通过遍历程序依赖图节点,选取符合4类漏洞关注点的代码元素,并记录节点作为切片基点;
具体地,
通过在标识符声明节点中匹配“[”字符来确定数组元素;
通过在标识符声明节点中匹配“*”字符来确定指针元素;
通过正则表达式规则来匹配表达式运算节点;
通过Li 等人[19]提供的敏感 API 列表进行敏感 API 节点匹配;
如图 2 中程序依赖图提取部分所示, 1 号节点存 在指针元素 VAR1, 2 号和 5 号节点分别存在数组元素 VAR2 和 VAR3, 6 号节点存在敏感 API 元素strncat. 因此, 以上节点被选定为程序切片的基准点;
(2)程序切片生成. 从切片基准点出发, 分别执行前向及后向切片以生成程序切片. 具体而言, 在程序 依赖图上, 以漏洞关注点所在节点为起点, 分别追溯前向、后向的控制依赖边和数据依赖边, 并记 录涉及到的节点和边, 直到不再出现新增节点和边为止. 根据上述步骤得到的程序依赖图子图即为 一个程序切片. 因其只包含与漏洞关注点具有依赖关系的节点和边, 故在保留源代码结构信息的同 时, 排除了图中漏洞无关的信息. 图 2 中代码切片提取部分展示了从该源代码的程序依赖图中提取 的部分切片, 切片 1-切片 4 分别为以 VAR1、VAR2、VAR3 和 strncat 为切片基准点获得的切片;
(3)程序切片标注. 本文依赖漏洞的补丁信息对切片进行标注, 即: 包含该漏洞补丁中删减行的切片被 标注为有漏洞切片, 反之被认为是无漏洞切片. 根据其提供的漏洞信息, 漏洞补丁的删减行为源代 码的第 11 行, 即对应程序依赖图中的 6 号节点. 根据标注规则, 由于图 2 的切片 1-切片 4 均包含 6 号节点, 因此均被标注为有漏洞切片.
程序依赖图子图包含两个维度的特征, 即节点内的代码特征(下文简称为节点特征)和图结构特征.