<<基于图嵌入的代码相似性度量>>(梁瑶、谢春丽等著)
引言
该方法使用控制流程图来表示代码的执行语义,并使用基于随机游走(Random Walk)的图嵌入方法来学习和推理代码的语义信息,用于检测代码相似性
相关工作
代码相似性检测流程可以分为代码格式转换和相似度确定两个阶段 ,具体可以细分为代码预处理 、中间表示转换 、比较单元生成和度量算法匹配4个部分,检测流程如图1所示
图嵌入方法:随机游走算法中的DeepWalk算法。该方法将网络中随机游走得到的节点序列看作一个句子,将网络中的节点看作句子中的单词
基于图嵌入的代码相似性检测模型
预处理层
1、调用parse_file()函数读取源代码文件
2、使用CFGASTVistor()方法遍历AST中的文件类型节点、函数类型节点、复合语句类型节点、If语句类型节点、验证函数类型节点、While语句类型节点
3、调用make_cfg_from_AST()函数生成CFG
4、获取CFG的节点和边并将其可视化
表征层
将预处理得到的CFG文件输入到DeepWalk模型中得到代码向量
DeepWalk算法的实现过程
该算法主要由两部分组成,分别是随机游走生成和使用SkipGGram模型学习表达向量。具体可以分为以下4个步骤:
(1)读取:读入代码片段的CFG文件并格式化为后缀名为.gml的文件,然后使用networkx构造有向图
(2)采样:通过DeepWalk算法对有向图中的节点进行采样,得到一个指定步长的节点序列列表
(3)训练SkipGGram模型:将采样得到的节点序列作为SkipGGram模型的输入,模型的输出是相邻节点的概率,通过最大化相邻节点概率值训练和学习周围节点
(4)计算嵌入:即得到 SkipGGram隐藏层中每个嵌入节点的向量表示,然后使用加权平均得到代码的向量表示
相似度计算层
采用余弦相似度度量片段之间的相似值
可视化层
Pyqt5的Qt Designer
相关知识
DeepWalk模型:通过对每张控制流程图所含的节点的向量并使用加权平均值来计算图的向量
Word2Vec模型:训练词向量并使用加权平均值来计算图向量
Doc2Vec模型:训练句向量并使用加权平均值来计算图向量
缺陷
针对最大公约数功能问题进行实验,其区别在于对某个数的初始化赋值有无经过条件判断语句,得到了不同的结果。结果显示,与Word2Vec模型结果相比,DeepWalk模型结果的相似度值较低