读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
2
cd cpgnn
python main_oj.py --clone_test_supervised --epoch 30 --classification_num 15 --clone_threshold 0.5 --dataset oj_clone_encoding --type_dim 16 --layer_size [32,32,32,32,32] --batch_size_clone 512 --gpu_id 0,1 --report clone_oj

其他研究

https://dl.acm.org/doi/abs/10.1145/3395363.3397362

https://github.com/shiyy123/FCDetector

https://reanon.top/2021/043852b75b.html

https://github.com/CGCL-codes/Amain