读paper10-代码相似度
读paper10-代码相似度
2024.10.14:项目换血,这个用不到了。。。。。
Learning graph-based code representations for source-level functional similarity detection
https://github.com/jun-zeng/Tailor
https://ieeexplore.ieee.org/stamp/stamp.jsp?tp=&arnumber=10172499
代码相似性通常被划分为这四种类型:
类型 I–除空白、代码注释和布局外,代码完全相同。
类型 II–代码结构和语法完全相同,标识符名称、类型、布局和注释除外。
类型 III–符合类型 II 的特征,但有添加、删除或修改的声明。
类型 IV–代码具有相同的功能和效果,但通过不同的语法结构实现。
不过,AST 与程序语义(如控制流)无关,这限制了它识别语法不同但语义相似的程序的能力。作为一种补救措施,基于图的方法建立了程序依赖图(PDG),纳入了控制/数据依赖关系,通过发现同构子图来预测语义相似的功能。这些方法虽然性能较高,但受到图同构检测效率低的限制。相反,最近的工作将同构子图的查找问题转化为匹配图模式。然而,这些技术通常只关注局部邻域(如 PDG 中的one-hop邻域),限制了程序语义(如multi-hop控制依赖关系)的表达能力。例如,DeepSim将控制/数据流编码为邻接矩阵,但该矩阵只能描述两个变量之间的一阶依赖关系。
图神经网络的关键在于通过沿图路径传播节点表示来学习图结构。这就为多跳邻居建立了富有表现力的模型,为图表示学习注入了结构知识。直观地说,考虑到代码特征的图结构(如控制流图),GNN 有利于程序语义的推理,从而实现更有效的功能相似性检测。此外,GNN 还具有卓越的效率,其运行时复杂度与输入图的大小呈线性关系。
首先,我们需要确定哪种代码表示法包含描述功能的关键特征。由于不同的代码表示法是针对独特的程序特征而设计的,因此我们选择将它们组合成一个联合图结构,命名为代码属性图(CPG),从而提供代码功能的全面视图。特别是,我们将 AST、控制流图和数据流图整合到 CPG 中,因为它们为程序分析提供了基本的语法和语义特征。之后,我们设计了一个基于 CPG 的神经网络(CPGNN)来提炼 CPG 中有用的特征,用于功能相似性检测。更具体地说,CPGNN 通过在 CPG 上迭代传播程序嵌入来重新定义它们。通过进一步堆叠多个传播迭代,它强制程序嵌入整合了图结构的 CPG 模式,从而预测相似功能。
代码使用
环境要求
- Ubuntu (Ubuntu 20.04 and 18.04都可以)
- two GPUs, each with 32GB memory;
- Physical memory: 64 GB
拉取docker镜像,可以直接使用如下命令:
1 | wget -O tailor_image.tar https://zenodo.org/records/7533280/files/tailor_image.tar?download=1 |
加载镜像
1 | docker load < tailor_image.tar |
1 | docker run -it --gpus all tailor_image bash |
加文件映射
1 | docker run -it -v /data/yyf-zwn/code_folder:/home/code --gpus all tailor_image bash |
Make sure you have oj_clone_encoding under cpgnn/data
1 | cd cpgnn |
其他研究
https://dl.acm.org/doi/abs/10.1145/3395363.3397362
https://github.com/shiyy123/FCDetector