发布于 

深度学习在代码克隆检测中应用与展望

摘要

现代计算机软件发展过程中,数以百万计的开发者参与并贡献了大量高水平的软件代码。然而由于代码本身所具有的抽象性、复杂性与可变性,想要进行高效、快速的软件开发是一个艰巨任务。代码表征是对代码数值化的一种技术,把代码映射为一组连续的实值向量,提取隐藏在代码内部的属性,辅助程序员生成或分析代码。代码克隆检测属于代码表征下的分支,代码克隆是指存在于代码库中两个及两个以上相同或者相似的源代码片段,是软件开发中的常见现象。代码克隆能够提高效率,但也可能意外引入外部漏洞。本文主要介绍代码克隆检测、代码克隆检测在区块链智能合约代码的展望。并对基于深度学习在代码克隆检测中应用的未来发展趋势进行分析和展望。

1 引言

随着代码开源活动的兴起,全球开源项目呈指数级增长。开源贡献者在开源平台贡献了大量高质量的开源项目,这些项目中包含了丰富的程序信息,如源代码、代码注释、故障报告以及测试用例等。近年来,由于深度学习在自然语言中的出色表现,逐渐有学者开始把循环神经网络、卷积神经网络、图神经网络等模型引入到源代码表征中,试图挖掘隐藏在源代码中的深层次复杂特征,进一步提高代码表征的能力。将深度学习技术融入代码表征,开展更深层次的代码表征的研究,已经成为软件工程领域解决各类问题的新方法。通过从海量数据学习代码的语法、语义特征,用于解决各类下游任务。与传统的基于机器学习的方法相比,基于深度学习的表征模型能够自动学习代码的结构和抽象语义的隐藏特征,更有效地提高代码表征的准确性。本文对深度学习在代码表征中的一些具体研究与应用,如代码克隆检测进行了分析与总结,并展望了代码克隆检测在区块链智能合约代码的研究。

2 代码克隆检测

2.1 代码克隆检测定义

代码表征是对代码数值化的一种技术,把代码映射为一组连续的实值向量,提取隐藏在代码内部的属性,辅助程序员生成或分析代码。代码克隆检测属于代码表征下的分支,代码克隆是指存在于代码库中两个及两个以上相同或者相似的源代码片段,是软件开发中的常见现象。代码克隆能够提高效率,但也可能意外引入外部漏洞。代码克隆的类型主要分为两大类,句法克隆和语义克隆。句法克隆指文本相似的代码片段, 语义克隆则是指功能相似的代码片段。基于这两大类,代码克隆可以被划分为四小类:
类型-1:去除空格,空行和注释,完全相同;
类型-2:除了对 一些函数名,类名,变量重命名以外,完全相同;
类型-3:片段部分被修改,如添加或删除了部分代码片段,或是重新排序部分代码片段;
类型-4:语义相似,但句法不相似(非常难检测)。
其中前三种为句法克隆,第四种为语义克隆。当前,学术界对类型1,2,3类克隆的检测已颇为成熟,尤其是对Java和C++语言的克隆检测; 对类型4类克隆的检测准确率仍不高,无法达到工业界应用标准。

对于两个代码片段来说,基本来说有两种相似性。对于两个相似的代码段,要么是它们的程序文本相似(代码的某些片段相似)要么是它们的功能是相似的但是程序的文本没有任何相似的地方。对于句法克隆来说主要的原因就是复制了某个代码片段然后把它粘贴到了其他你需要的地方。这些克隆的的类型从类型1到类型4他们的变化是逐级递增的,同样的他们的分析难度以及检测难度也是逐级递增的。类型1最低,类型4最难。检测类型4的代码克隆需要大量的程序构建背景知识和软件设计的背景知识。

2.2 代码克隆检测背景

由于目的不同,产生的代码克隆往往具有不同的特点,这些不同类型的代码克隆往往对原代码有着不同程度的修改,而这些代码修改往往会在一定程度上影响代码克隆检测工具的性能。已有研究工作发现软件系统中的代码克隆是有害的,会导致系统稳定性降低,造成代码库冗余和软件缺陷传播等问题。因此,在指定的应用场景下,选对代码克隆检测方式是十分重要的。此后代码克隆检测技术便被应用于软件工程领域,并且取得了不错的结果。事实上,关于代码克隆是否应该被移除的问题,学术界并没有达成一致。而对于不同的应用场景,判断两段代码是否为克隆的指标也并不相同。当前的困难在于自动检测工具并不能判断哪种克隆是值得删除的,哪些克隆是应该留下的。随着代码开源成为潮流,代码克隆占比越来越高。在近20年内,代码克隆检测受到了学术界和工业界的广泛关注和重视,取得了很多进展。在代码克隆检测的研究领中,研究者的主要目的是检测软件系统中存在的代码克隆,并且生成检测报告,以帮助软件开发人员对代码进行优化。代码克隆检测技术旨在寻找检测代码克隆的自动化方法,从而用较低成本减少代码克隆的负面效应。

2.2 代码克隆检测方法

在众多代码克隆检测方法中,有一些特征可以用于区分、描述不同的代码克隆检测方法。这些特征体现了克隆检测技术是如何工作的。目前代码克隆检测方法被主要分为5类:

(1)基于文本的克隆检测方法:基于文本的克隆检测方法将源代码看作是字符序列,比较代码字符序列相似度并且返回字符串匹配结果集。这类方法易于实现,而且与语言无关。但是这类方法一般只能检测出类型-1,类型-2的代码克隆,对类型-3,类型-4代码克隆效果较差,不能很好地检测出在句法和语义层面上的代码修改。

(2)基于词法的克隆检测方法:基于词法的检测方法将代码转换成符号、词汇。将符号、词汇序列视为抽象的代码表示。一般使用符合编译原理的符号序列进行标识。这种抽象的级别可以根据预先定义的需要来决定抽取哪个层面的信息,抽取的粒度可以分为词汇、函数、语句等不同级别。相比于基于文本的代码表征方法来说,这种方法能够匹配到代码的特有信息,但从本质上来说,这种方法还是与基于文本表征的方法一样,单纯地将代码视为符号序列。基于符号的方法的缺点在于没有考虑代码中所包含的结构信息。同时,这类方法对代码语句修改比较敏感,容易漏检只有特定细微差别的代码克隆。

(3)基于语法的克隆检测方法:基于语法的克隆检测方法考虑源代码语法规则,将源代码转换为其对应的抽象语法树。抽象语法树是一个比较常用的将代码转换为树的一个方法,能够保留源代码中的语法信息。基于树的方法可以避免由于格式和句法问题引起的问题,因为基于树的方法关注于不同程序结构层面上的相似度。但是基于树的方法时间复杂度比较高,还有些方法使用编译器对源代码进行编译,但是部署成本高。基于树的方法的优点是能够考虑到源代码的结构特性,其缺点是不能识别出标识符和文本值的不同,并且基于树的方法计算开销大。

(4)基于语义的克隆检测方法:基于语义的方法不仅希望获得代码之中的结构信息,还试图获得代码中的语义信息,例如,代码的控制流和数据流。作为基于语义表征方法的一种,基于图的检测技术可以同时考虑源代码的语法和语义信息,可以检测到非连续的代码克隆。

(5)基于度量值的克隆检测方法:基于度量值的方法只对代码进行固定粒度的检测,基于度量值的方法并没有直接比较源代码,而是计算度量值的相似性。度量值包括函数名、声明、布局、控制流、返回值等。基于度量值方法的优点是准确率高,并且检测速度块。

2.3 代码克隆检测技术应用与挑战

克隆检测技术应用目前在Bug解决方案推荐、克隆相关Bug检测、程序理解、横切关注点的确定、克隆提醒、代码重构、版权保护及剽窃检测都有很好的效果。虽然代码克隆检测的研究已经有超过20年的历史,在这期间也有非常多的研究者们贡献了非常多的成果,但是现有研究成果与工业界的期望还是有着一定的距离。新兴的混淆技术例如识别密码算法已经被现代恶意软件广泛采用,以达到规避检测的目的,然而现有的代码相似性比较方法,无论是基于源代码还是基于二进制代码,大多不能抵抗混淆,因此自动检测非常困难。未来代码克隆检测工具研究需要针对这一问题开展,以适应新的发展需求。同时跨语言代码克隆检测也是重要研究课题之一。

3 代码克隆检测在区块链智能合约代码的展望

3.1 区块链与智能合约介绍

区块链是一个开放的、分布式的、仅有附录的账本,其中两方之间的所有交易都被可核查地、永久地记录下来。每个区块都通过加密哈希与前一个区块相连,从而形成一个区块链。以太坊是在市值方面最大的区块链系统之一,仅次于比特币。它建立在比特币的原理之上,但通过 "智能合约"大大增强了比特币的功能。事实上,智能合约是通过以太坊虚拟机存储和执行的计算机程序,它们可以通过交易部署、调用和从以太坊移除。

3.2 区块链与智能合约安全风险与代码克隆检测的挑战

然而,随着智能合约的普及,以太坊已经成为各种严重网络犯罪的目标,最近关于以太坊智能合约安全的一个趋势是,危害较小但潜伏性较强的骗局激增,包括庞氏骗局、蜜罐和钓鱼骗局。从外表上看,他们把自己伪装成普通的智能合约,同时引诱良性用户向攻击者转移加密货币。因此,发现在以太坊中,从大量智能合约中发现骗局已经成为一个紧迫的安全问题。近年来,伴随着人工智能的快速发展,深度学习模型开始被应用在智能合约代码检测领域。借助深度学习使用大规模的数据集对模型进行训练,以此来检测以太坊中具有欺骗性质的智能合约。但是目前使用机器学习对智能合约进行的方法大多是从源码层面和方法粒度进行的,导致机器学习的模型无法有效的对智能合约进行语义的提取,准确率不高。随着区块链技术应用快速发展,智能合约数量的爆炸性增长。合约代码的重用越来越频繁,智能合约的相似度检测也越来越重要,由智能合约相似性检测基础上可以进行对智能合约漏洞搜索、恶意合约检测和合约升级威胁检测等。目前,对智能合约的相似性检测缺乏数据集支撑,另外,以太坊智能合约的开发语言Solidity版本和其编译器版本较多,给智能合约安全审计和相似性分析带来了困难。

3.3 代码克隆检测在区块链智能合约代码的展望

随着区块链技术的普及和应用不断深入, 新兴的智能合约技术在学术界和产业界吸引了广泛的关注。智能合约去中心化、去信任、自治自足、不可篡改等特性允许合约各方在无需任何信任基础或第三方可信权威的情况下完成交易, 同时, 其可嵌入的数字形式有望促成各类可编程的智能资产、系统和社会, 深入变革金融、管理、医疗、物联网等诸多传统领域。在大量商业应用不断涌现的同时, 相关学术研究特别是基础理论研究还处于早期阶段, 行业内尚缺乏方向性研究框架和共同的话语体系。

目前代码克隆检测在区块链智能合约的研究还是比较少的,但是目前以太坊平台的代码有着较高的克隆率,智能合约一旦部署,其漏洞是无法修复的。智能合约的高克隆率会严重影响代码质量,造成经济损失。因而在部署智能合约前进行代码克隆检测是十分必要的。将代码克隆检测引入智能合约领域能够极大地促进以太坊智能合约代码克隆检测领域的发展。

总结

通过将代码克隆检测引入区块链智能合约领域,不仅丰富与补充代码克隆检测的研究,也一定程度的促进了以太坊区块链的安全发展与稳定运行。对于区块链的智能合约相关学术研究特别是基础理论研究还处于早期阶段,所以智能合约代码克隆检测有着很不错的学术研究前景。

参考文献

致谢

感谢我的各位同学和老师无私奉献精神和爱岗敬业的治学态度,疫情期间是您们的无私帮助让我感受到校园的温暖,在我的论文写作过程当中,多位同学为我带给了信息支持,在此一并表示感谢。