DeepSim: Deep Learning Code Functional Similarity

2023-10-18 18:59

本文主要是介绍DeepSim: Deep Learning Code Functional Similarity,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

论文阅读 DeepSim: Deep Learning Code Functional Similarity

代码的功能相似性检测

1、现存的大多数方法聚焦于代码的语法相似性,功能相似性还是一个挑战

(现存方法:都一般遵循相同的流程
首先从源代码中提取语法特征,以原始文本、tokens或者AST的形式
然后使用某个距离度量公式,如欧氏距离来检测相似的代码)

本文中提出的方法:将代码的控制流和数据流编码成一个语义矩阵,矩阵的每个元素都是一个高维稀疏的二进制向量

在这种表示下,我们设计一个深度学习模型来衡量代码功能相似性
通过将从“代码对”中学到的“隐藏表示”连接起来,这个DNN模型把检测功能相似性转化为了一个二元分类的问题,从而可以学习到这样的模式:虽然语法差异比较大,但是功能比较相似的代码之间的模式。

2、JAVA数据集

构建程序依赖图(PDG),通过子图同构来判断的变现比AST好,但是子图同构复杂性高(they either do not scale due to the complexity of graph isomorphism图同构具有复杂性,不可伸缩??;要么使用可扩展性的序列来近似图,而不精确,例如:将PDG中的子图映射到AST深林,比较AST中提取的语法特征向量)

3、DeepSim有两个关键点:

①如果特征表示具有更高的抽象,则它对于度量代码语义更为强大
因为更高的抽象需要捕获更多的代码语义信息
控制流和数据流代表的是比语法特征更高的抽象
所以,DeepSim使用控制流和数据流作为相似性度量的基础
②我们提出了一种新型的编码方法:将代码的控制流和数据流编码成为一个压缩的语义矩阵,矩阵的每个元素都是一个高维稀疏二值特征向量。
通过这种编码,我们将代码相似性度量的问题简化为识别矩阵中的相似模式。这比发现子图更具有收缩性。
在这里插入图片描述

包含主要的两部分:

①Code semantic(语义) representation through encoding control flow and data flow into a feature matrix
可以将任意语言的代码片段作为源代码、字节码或二进制代码形式的输入,只要可以构造数据流图和控制流图
②Code similarity measurement through deep learning
该模型包含两个联系紧密的模块:
NN模块:提取高级特征(隐藏表示)
二元分类模块:判断代码对在功能上是否相似
数据集

在JAVA数据集上已经实现

两个数据集:

a dataset of 1,669 Google Code Jam projects(数据集地址) and the popular BigCloneBench(数据集地址),which contains over 6,000,000 tagged clone pairs and 260,000 false clone pairs.

本篇文章关于深度学习反向传播的解释:

The goal is to minimize the error (e.g., squared error) of reconstructing the inputs from its
hidden representation:
在这里插入图片描述
模型训练过程:
在这里插入图片描述

将控制流和数据流代表的语义信息编码为一个稀疏矩阵的过程:

控制流捕获代码基本块和过程之间的依赖关系(控制流分为顺序、分支、循环结构)
数据流捕获沿着程序路径和操作的数据值流

以上是表示代码行为的基础

我们basic idea是将控制流和数据流编码为变量之间和基本块之间的关系

Our basic idea is to encode code control flow and data flow as relationships between variables and
between basic blocks (e.g., operations, control jumps).

To obtain the control flow and data flow, we may perform the analysis on either source code, binary code, or any intermediate representation (e.g., Java bytecode, LLVM bitcode).
In this paper we focus on Java bytecode using the WALA framework
代码示例和控制流图(CFG):

这篇关于DeepSim: Deep Learning Code Functional Similarity的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/234540

相关文章

Debugging Lua Project created in Cocos Code IDE creates “Waiting for debugger to connect” in Win-7

转自 I Installed Cocos Code IDE and created a new Lua Project. When Debugging the Project(F11) the game window pops up and gives me the message waiting for debugger to connect and then freezes. Also a

LLVM入门2:如何基于自己的代码生成IR-LLVM IR code generation实例介绍

概述 本节将通过一个简单的例子来介绍如何生成llvm IR,以Kaleidoscope IR中的例子为例,我们基于LLVM接口构建一个简单的编译器,实现简单的语句解析并转化为LLVM IR,生成对应的LLVM IR部分,代码如下,文件名为toy.cpp,先给出代码,后面会详细介绍每一步分代码: #include "llvm/ADT/APFloat.h"#include "llvm/ADT/S

简单的Q-learning|小明的一维世界(3)

简单的Q-learning|小明的一维世界(1) 简单的Q-learning|小明的一维世界(2) 一维的加速度世界 这个世界,小明只能控制自己的加速度,并且只能对加速度进行如下三种操作:增加1、减少1、或者不变。所以行动空间为: { u 1 = − 1 , u 2 = 0 , u 3 = 1 } \{u_1=-1, u_2=0, u_3=1\} {u1​=−1,u2​=0,u3​=1}

简单的Q-learning|小明的一维世界(2)

上篇介绍了小明的一维世界模型 、Q-learning的状态空间、行动空间、奖励函数、Q-table、Q table更新公式、以及从Q值导出策略的公式等。最后给出最简单的一维位置世界的Q-learning例子,从给出其状态空间、行动空间、以及稠密与稀疏两种奖励函数的设置方式。下面将继续深入,GO! 一维的速度世界 这个世界,小明只能控制自己的速度,并且只能对速度进行如下三种操作:增加1、减

VS Code 调试go程序的相关配置说明

用 VS code 调试Go程序需要在.vscode/launch.json文件中增加如下配置:  // launch.json{// Use IntelliSense to learn about possible attributes.// Hover to view descriptions of existing attributes.// For more information,

pytorch torch.nn.functional.one_hot函数介绍

torch.nn.functional.one_hot 是 PyTorch 中用于生成独热编码(one-hot encoding)张量的函数。独热编码是一种常用的编码方式,特别适用于分类任务或对离散的类别标签进行处理。该函数将整数张量的每个元素转换为一个独热向量。 函数签名 torch.nn.functional.one_hot(tensor, num_classes=-1) 参数 t

torch.nn 与 torch.nn.functional的区别?

区别 PyTorch中torch.nn与torch.nn.functional的区别是:1.继承方式不同;2.可训练参数不同;3.实现方式不同;4.调用方式不同。 1.继承方式不同 torch.nn 中的模块大多数是通过继承torch.nn.Module 类来实现的,这些模块都是Python 类,需要进行实例化才能使用。而torch.nn.functional 中的函数是直接调用的,无需

code: 400, msg: Required request body is missing 错误解决

引起这个错误的原因是,请求参数按照get方式给。 应该给json字符串才对 补充: 1. @RequestBody String resource 加@RequestBody必须给json字符串,否则会报错400,记如标题错误。 不加这个的进行请求的话,其实post和get就没有什么区别了。 2. List<String> indexCodes=(List<String>)json.

iOS项目发布提交出现invalid code signing entitlements错误。

1、进入开发者账号,选择App IDs,找到自己项目对应的AppId,点击进去编辑, 2、看下错误提示出现  --Specifically, value "CVYZ6723728.*" for key "com.apple.developer.ubiquity-container-identifiers" in XX is not supported.-- 这样的错误提示 将ubiquity

Deep Ocr

1.圈出内容,文本那里要有内容.然后你保存,并'导出数据集'. 2.找出deep_ocr_recognition_training_workflow.hdev 文件.修改“DatasetFilename := 'Test.hdict'” 310行 write_deep_ocr (DeepOcrHandle, BestModelDeepOCRFilename) 3.推理test.hdev