CN117435246B - 一种基于马尔可夫链模型的代码克隆检测方法 - Google Patents

一种基于马尔可夫链模型的代码克隆检测方法 Download PDF

Info

Publication number
CN117435246B
CN117435246B CN202311718616.8A CN202311718616A CN117435246B CN 117435246 B CN117435246 B CN 117435246B CN 202311718616 A CN202311718616 A CN 202311718616A CN 117435246 B CN117435246 B CN 117435246B
Authority
CN
China
Prior art keywords
ast
markov chain
state transition
code
matrix
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202311718616.8A
Other languages
English (en)
Other versions
CN117435246A (zh
Inventor
杨浩然
严斌宇
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sichuan University
Original Assignee
Sichuan University
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sichuan University filed Critical Sichuan University
Priority to CN202311718616.8A priority Critical patent/CN117435246B/zh
Publication of CN117435246A publication Critical patent/CN117435246A/zh
Application granted granted Critical
Publication of CN117435246B publication Critical patent/CN117435246B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/70Software maintenance or management
    • G06F8/75Structural analysis for program understanding
    • G06F8/751Code clone detection
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F17/00Digital computing or data processing equipment or methods, specially adapted for specific functions
    • G06F17/10Complex mathematical operations
    • G06F17/16Matrix or vector computation, e.g. matrix-matrix or matrix-vector multiplication, matrix factorization
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N20/00Machine learning
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N7/00Computing arrangements based on specific mathematical models
    • G06N7/01Probabilistic graphical models, e.g. probabilistic networks
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Software Systems (AREA)
  • Mathematical Physics (AREA)
  • General Engineering & Computer Science (AREA)
  • Data Mining & Analysis (AREA)
  • Computing Systems (AREA)
  • Mathematical Analysis (AREA)
  • Mathematical Optimization (AREA)
  • Pure & Applied Mathematics (AREA)
  • Computational Mathematics (AREA)
  • Algebra (AREA)
  • Artificial Intelligence (AREA)
  • Evolutionary Computation (AREA)
  • Databases & Information Systems (AREA)
  • Computer Vision & Pattern Recognition (AREA)
  • Medical Informatics (AREA)
  • Probability & Statistics with Applications (AREA)
  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Abstract

本发明属于代码克隆检测技术领域,公开了一种基于马尔可夫链模型的代码克隆检测方法,将待匹配的两代码段生成抽象语法树AST;对于每个AST,将AST中的节点按照每连续的三个节点为一组进行拆分;基于马尔可夫链,构建每个AST的状态转移矩阵,并将其转化为转移概率矩阵;计算得到的两个AST对应的转移概率矩阵之间的距离向量,并以得到的距离向量作为提取的特征向量;对提取的特征向量进行选择;依据选择的特征,通过分类模型判断两代码段是否存在克隆关系。本发明能够在提高检测精度的同时,极大降低计算难度,减少时间开销,并提高方法适用的可扩展性。

Description

一种基于马尔可夫链模型的代码克隆检测方法
技术领域
本发明属于代码克隆检测技术领域,具体涉及一种基于马尔可夫链模型的代码克隆检测方法。
背景技术
软件系统内部或软件系统之间相似的代码片段称为克隆的代码片段。当开发人员通过复制、粘贴和修改来重用代码时,就会创建克隆。开发人员需要检测和管理他们的克隆,以保持软件质量、检测和防止新的错误及降低开发风险和成本等。代码克隆检测的目的是挖掘出功能相似的代码片段,在软件工程中引起了广泛的关注。
根据相似度类型的不同,可将代码克隆分为四种类型:(1)Type-1类型的代码克隆是指除了不同的空白、布局和注释其它完全相同的代码片段;(2)Type-2类型的代码克隆是指除了Type-1克隆的差异、标识符名称和词法值不同之外,代码片段完全相同:(3)Type-3类型的代码克隆是语法相似的代码片段,但在语句级别有所不同;除了Type-1和Type-2克隆的差异之外,这些片段之间还会相互添加、修改或删除语句;(4)Type-4类型的代码克隆是指语法上不同的代码片段实现相同的功能,即语义克隆类型。
目前已经提出了很多检测代码克隆的方法。例如,CCFinder通过词法分析从输入代码中提取令牌序列,并应用几种基于规则的转换将令牌序列转换为规则形式,以检测Type-1和Type-2克隆。为了检测更多类型的克隆,设计了另一个最先进的基于令牌的工具SourcererCC。它在不同的方法中捕获令牌的重叠相似性,以检测Type-3类型克隆。SourcererCC是最具可扩展性的代码克隆检测器,它可以扩展到非常大的代码(例如250M行代码)。然而,由于缺乏对程序语义的考虑,这些基于令牌的方法不能处理Type-4克隆,即语义克隆。为了解决这些问题,研究人员进行程序分析,将代码片段的语义提炼成图或树来表示,例如AST、PDG、CFG等,并进行树匹配或图匹配,以测量给定代码之间的相似性。这种基于树匹配或图匹配的代码克隆检测方法,与基于令牌的检测方法相比,在检测Type-4类型的代码克隆上具有更高的效率,但由于图匹配和树匹配时间复杂度非常高,消耗时间过长,它们无法扩展到大规模的代码。
发明内容
针对目前代码克隆检测方法难度大、效率低的问题,本发明目的旨在提供一种基于马尔可夫链模型的代码克隆检测方法,在提高检测准确率的同时,能够极大减少时间开销,并提高可扩展性。
由于树匹配有较大的时间开销,本发明将AST中有序相连的两个节点看作初始状态,与之相连的下一个节点看作下一状态,以此建立二阶马尔可夫链模型来描述节点之间的状态转换。通过将树状的结构转换成易于分析的状态转移概率矩阵来减少时间开销。通过计算相似性距离,获得AST之间所有状态的距离向量,进而对得到的距离向量的每个特征进行特征过滤和筛选来减少时间开销,提高可扩展性。最后根据得到的特征训练一个分类器,来实现简洁有效的语义代码克隆检测。该方法主要由五个阶段组成:AST生成、状态矩阵构建、特征提取、特征选择和分类。
基于上述分析,本发明提供的基于马尔可夫链模型的代码克隆检测方法,其包括以下步骤:
S1 将待匹配的两代码段生成抽象语法树AST;
S2 对于每个AST,将AST中的节点按照连续的三个节点为一组进行拆分;基于马尔可夫链,构建每个AST的状态转移矩阵,并将其转化为转移概率矩阵;
S3 计算得到两个AST对应的状态转移概率矩阵之间的距离向量,并以得到的距离向量作为提取的特征向量;
S4 对提取的特征向量进行选择;
S5 依据选择的特征,通过分类模型判断两代码段是否存在克隆关系。
上述步骤S1,此阶段的目的是应用静态分析工具得到两个代码段对应的AST。此阶段的输入为程序源代码,输出为AST。
上述步骤S2,此阶段的目的是基于马尔可夫链原理将AST转换为状态转移概率矩阵。此阶段的输入为AST,输出为状态转移概率矩阵。在具体实现方式中,步骤S2包括以下分步骤:
S21将AST中的节点按照连续的三个节点为一组进行拆分;前两个连续的节点作为马尔可夫链状态转换的初始状态,另外一个节点作为马尔可夫链状态转换中的另一状态;
S22 基于马尔可夫链状态转换中的两个状态构建状态转移矩阵;
S23 将状态转移矩阵转化为转移概率矩阵。
上述步骤S21中,以节点类型表征节点状态。对于AST,其包含叶节点和非叶节点,叶节点包含14种令牌类型,非叶节点包含57种代码语法类型,并添加一个Null类型来表示未包含在14种令牌类型的其他令牌类型;因此,对于一个节点有72种类型,定义72种状态。而对于连续的两个节点,一般只存在493种类型,因此有493种初始状态。
上述步骤S22中,状态转移矩阵中的元素matrix[i][j]的值表示AST中第i个初始状态转换为第j个下一状态的次数。
上述步骤S23中,假设状态转移矩阵为M1,则状态转移概率矩阵M2元素的计算公式为:
式中,K表示状态转移矩阵M1的列数(也即下一状态的数量)。
上述步骤S3,此阶段的目的是计算两个状态转移概率矩阵的距离向量。此阶段的输入是两个矩阵,输出是它们的特征向量。本发明中,将两个AST的转移概率矩阵的对应行向量进行距离计算,得到的距离值构成距离向量。为了提高检测精度,本发明采用两种以上的距离计算方法计算两个AST对应的转移概率矩阵之间的距离向量,并将不同方法计算得到的距离向量在维度上进行拼接。
上述步骤S4,此阶段的目的是对特征提取阶段得到的特征向量进行选择。本发明通过训练集确定若干对检测有影响的若干特征。
本发明基于训练集得到的样本特征向量进行过滤和筛选。此阶段的输入是包含全部特征的特征向量,输出是选择后的特征数量较少、包含有用信息较多的特征向量。在具体实现方式中,特征过滤是基于统计值的筛选方法,主要通过计算特征和特征目标变量之间的相关性、自相关性、发散性等统计指标,来移除某些不相关或冗余的特征。本发明中,采用至少一个特征过滤算法对提取的特征向量进行过滤;所述特征过滤算法包括T-test、归一化互信息(Normalized Mutual Information)、距离相关性(Distance Correlation)等。优选实现方式中,首先采用三个特征过滤算法分别对提取的特征向量进行过滤;然后对过滤后的特征对应的计算结果做归一化处理,即得到每一种算法过滤后每一个特征在[0,1]内的得分情况;接着,对三种算法过滤后的特征向量取并集;同时得到每一个特征对应三种算法计算结果归一化后的平均值;依据得到的平均值大小,对过滤后的特征按照从大到小进行排序,完成特征过滤。之后,采用机器学习算法对过滤后的特征进行筛选;所述机器学习算法为随机森林算法(RandomForest)、KNN-1、KNN-3、决策树(Decisiontree)、极端梯度提升分类算法(Xgboost classifier)或迭代算法(AdaBoost)等经典机器学习算法。依据不同算法的F1分数,选择F1分数最大且达到平稳时所需特征数量最少的算法作为特征筛选使用的算法,依据该算法确定的特征作为后续代码克隆检测中特征选择依据。
上述步骤S5,此阶段的目的是确定两个程序在语义上是否相似。此阶段的输入为经特征选择后的特征向量,输出为报告检测结果,即存在克隆关系或不存在克隆关系。本发明中,采用的分类模型可以为随机森林算法、KNN-1、KNN-3、决策树、极端梯度提升分类算法或迭代算法等。
与现有技术相比,本发明提供的基于马尔可夫链模型的代码克隆检测方法具有以下有益效果:
1)本发明基于马尔可夫链原理,利用AST中的语义信息,首先对节点类型进行划分,然后利用连续三个节点之间的信息来构建节点状态的转移概率矩阵,再基于两段代码的转移概率矩阵,以两者的距离向量作为特征向量,这样能够在充分保留代码语义信息的同时消除复杂的树匹配;
2)本发明对得到的特征向量的每个特征进行过滤和筛选,来减少时间开销;
3)本发明利用代码语法类型和令牌类型来表征节点,能够提高方法适用的可扩展性;
4)本发明大幅提高了克隆检测准确率,其中对type4类型克隆检测效果提升尤为明显。
附图说明
图1为本发明提供的基于马尔可夫链模型的代码克隆检测方法的流程示意图;
图2为生成的AST实例;
图3为通过极端梯度提升分类算法计算得到的F1分数。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚,下面将对本发明的技术方案进行详细的描述。显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所得到的所有其它实施方式,都属于本发明所保护的范围。
实施例
本实施例提供的基于马尔可夫链模型的代码克隆检测方法,如图1所示,包括以下步骤:
S1 将待匹配的两代码段生成抽象语法树AST。
对于生成AST,可以根据编程语言的不同选择不同的静态分析工具来提取程序的AST。由于本实施例搜集的数据集为Java程序,这里选择开源库Javalang来完成静态分析,获取源代码的AST。
S2 对于每个AST,将AST中的节点按照每连续的三个节点为一组进行拆分;基于马尔可夫链,构建每组节点的状态转移矩阵,并将其转化为转移概率矩阵。
得到AST后,基于马尔可夫链原理,将AST节点之间的关系转换为矩阵进行表示,利用该矩阵实现高效可扩展的语义代码克隆检测。马尔可夫链是概率论和数理统计中具有马尔可夫性质且存在于离散的指数集和状态空间内的随机过程。马尔可夫链的生成依赖于一个假设,即当前状态转换到下一个状态的概率仅取决于它之前的状态。这样的假设大大降低了模型的复杂性,因此马尔可夫链被广泛应用于许多模型中,如循环神经网络和隐马尔可夫模型。
本实施例中,步骤S2包括以下分步骤:
S21 将AST中的节点按照连续的三个节点为一组进行拆分;前两个连续的节点作为马尔可夫链状态转换的初始状态,另外一个节点作为马尔可夫链状态转换中的另一状态。
实验表明,这种状态转换表示方法,比只考虑连续两个节点之间的状态转换能考虑更多树中的语义信息。
为了将AST转换为其相应的状态转移矩阵,首先要在AST中定义其状态。通过分析AST中的节点类型,发现AST中有叶节点和非叶节点两种类型。在非叶节点中,节点表示的是函数中不同代码的语法类型。在叶节点中,节点表示的是函数中的源代码令牌。源代码的令牌数量非常大,难以分析他们的具体数量。为了使大量的令牌对应于少量固定的数量,利用这些令牌的类型来代替具体的令牌。例如,可以将令牌“long”用它的类型“BasicType”替换。在GitHub等网站上爬取了大量Java语言程序源代码,并对其提取AST进行非叶节点的语法类型分析和叶节点的令牌类型分析。经过统计分析,在大多数AST中得到了共57种非叶节点的代码语法类型,14种叶节点的令牌类型,具体见表1-1和表1-2所示。
表1-1非叶节点的代码语法类型
表1-2叶节点的令牌类型
实际上,所有AST的非叶节点的代码语法类型全部在这57种类型中。而这14种类型的叶节点在所有AST的叶子节点中占比几乎超了99.5%。因此,选择这57种代码语法类型作为最终语法类型,14种令牌类型作为最终的令牌类型,并添加一个Null类型来表示其他令牌类型。在AST中定义72个状态后,便可构建一个马尔可夫链模型。
构建二阶马尔可夫链,就是最后一个节点的状态依赖于前两个节点的状态。因此,首先,将AST中的节点按照每连续的三个节点为一组进行拆分。将两个连续相连的叶节点看作马尔可夫链状态转换的初始状态,而与这两个节点紧密相连的下一个节点,也就是这两个节点中第二个节点的子节点,看作状态转换中的另一状态。这样,根据马尔可夫链原理,通过分析AST中由连续的两条边连接的三个节点的信息,在任意一个AST中,都可以推导出一个初始状态转移到另一个状态的概率。
以图2给出的AST部分子树为例,按照连续的三个节点为一组进行拆分,将两个连续相连的叶节点看作马尔可夫链状态转换的初始状态,而与这两个节点紧密相连的下一个节点作为转换中的另一个状态,可以得到10种状态转换,分别为:①ForStatement-ForControl→VariableDeclaration;②ForStatement-ForControl→MemberRefer;③ForControl-VariableDeclaration→BasicType;④ForControl-VariableDeclaration→VariableDeclarator;⑤ForControl-MemberRefer→Operator;⑥ForControl-MemberRefer→Identifier;⑦VariableDeclaration-BasicType→BasicType;⑧VariableDeclaration-VariableDeclarator→Identifier;⑨VariableDeclaration-VariableDeclarator→Literal;⑩VariableDeclarator-Literalr→DecimalInteger,每种状态各出现一次。
S22 基于马尔可夫链状态转换中的两个状态构建状态转移矩阵。
对于两个连续节点组成的马尔可夫链状态转换中的初始状态,由于每个节点有72种类型,不难计算出总共有72*72=5184种初始状态,而另一状态只有一个节点组成,有72种状态。因此,对于每一个AST,都可以得到一个5184*72的状态转移矩阵。然而这样构建出来的矩阵过于庞大,在后续的计算中难以处理如此大量的数据。因此通过对所有得到的AST中每两个节点之间的关系进行分析,结果表明,有序连续的两个节点在实际中的大多数情况下只存在493种类型,这个数量远远小于理论上的5184种类型,这将大大减少后续的工作难度和计算量。这样,就可以只构建493*72的状态转移矩阵,493行表征493种初始状态,72列表示另一节点的72种状态。状态转移矩阵中的元素matrix[i][j]的值表示AST中第i个初始状态转换为第j个下一状态的次数。
例如,对于图2给出的AST部分子树实例,其对应的状态转移矩阵可以表示为:
依次类推,可以得到两个待匹配代码段AST对应的状态转移矩阵。
S23 将状态转移矩阵转化为转移概率矩阵。
假设状态转移矩阵为M1,则状态转移概率矩阵M2元素的计算公式为:
例如,按照步骤S22中给出的状态转移矩阵,通过上述计算公式得到的转移概率矩阵为:
因此,按照步骤S22得到的两个待匹配代码段AST对应的状态转移矩阵,通过上述计算公式可以得到相应的转移概率矩阵。
S3 计算得到的两个AST对应的转移概率矩阵之间的距离向量,并以得到的距离向量作为提取的特征向量。
特征提取的主要目的是量化两个转移概率矩阵之间的差异。对于得到的两个转移概率矩阵,逐个计算其对应的状态(即行向量)之间的距离,例如,分别取两个矩阵的第一行向量进行距离计算。对于两个矩阵对应的每一行,都计算两个行向量之间的距离,可以获得所有状态之间的距离值,由于矩阵共有493行,所有可以获得493个距离值。这493个距离值构成了一个493维的距离向量,表示两个传递概率矩阵之间的整体距离。如何计算两个行向量之间的距离是本实施例需要考虑的问题。这里选择了常用且高效的四种距离度量方法,即余弦距离、欧几里得距离、曼哈顿距离和切比雪夫距离。这四种距离度量算法已经在许多领域如信息检索、数据挖掘等被广泛使用,并证明了他们的高效性。下面,将介绍这四种距离度量算法。
(1)余弦距离:余弦距离用于衡量两个向量之间的相似程度,通过计算两个向量之间夹角的余弦值来计算它们之间的距离。具体公式为:
式中,n表示向量元素数量,A、B表示两个向量,θ表示两个向量的夹角。
(2)欧几里得距离:欧几里得距离指的是m维空间中两个点之间的真实距离。在二维和三维空间中,它的计算公式是两点之间的距离(即两点之间直线最短的那段距离)。在更高维度的空间中,欧几里得距离的计算公式为:
式中,n表示向量元素数量,A、B表示两个向量。
(3)曼哈顿距离:曼哈顿距离是各坐标点的坐标差值的绝对值相加,其公式为:
式中,n表示向量元素数量,A、B表示两个向量。
(4)切比雪夫距离:切比雪夫距离是各坐标的坐标差值中的最大值,它的计算公式为:
式中,n表示向量元素数量,A、B表示两个向量。
为了使得距离度量更为全面,在得到四种单一距离向量后,将它们拼接起来形成一个新的向量,即拼接距离向量。由于四个距离向量的维数都为493,所以得到的拼接距离向量维数为493*4=1972。
S4 对提取的特征向量进行特征选择。
通过训练集确定对检测有影响的若干初始状态。
本实施例基于训练集(这里以GoogleCodeJam数据集作为训练集)得到的样本特征向量进行过滤和筛选。特征过滤和筛选是机器学习中对数据进行预处理的两种主要方法,用于降低特征的数量和提升特征的质量。由于在上一步得到的1972个特征数量过于庞大,会导致在后续的分类任务中较大的时间开销,所以对这1972个特征进行过滤和筛选,删除冗余的、信息量较少的特征来达到降维提速的目的。
以GoogleCodeJam数据集构建27万对克隆对(两组存在语义克隆(type-4类型克隆)关系的代码段)和27万对非克隆对(两组不存在克隆关系的代码段),并给出相应的克隆标签,标签“1”表示存在克隆关系,标签“0”表示不存在克隆关系。
(一)特征过滤:
特征过滤是一种基于统计值的筛选方法,主要是通过计算特征和特征目标变量之间的相关性、自相关性、发散性等统计指标,来移除某些不相关或冗余的特征。
为了使结果更加通用和可解释,选择了广泛使用并具有良好效果的三种算法,即T-test、归一化互信息(Normalized Mutual Information)、距离相关性(DistanceCorrelation)三种算法来进行特征过滤。下面,介绍这三个特征过滤算法。
(1)T-test算法:T-test利用t分布理论来推断差异发生的概率,然后比较两个均值之间的差异是否显著。T-test检验t统计量、t分布值和自由度来确定量组数据之间的差异概率,设X1、X2分别为比较的两个样本,S1、S2为样本方差,n1,n2为样本容量,则t检验的公式为:
在实验中,对于每一个特征,将样本分为克隆组和非克隆组,计算得到T-test的t值。对于t值为0的特征,可以表明克隆组和非克隆组之间的差异并不显著,则将此特征过滤。
(2)Normalized Mutual Information算法:为了评估算法的质量,将互信息(I(X;Y))进行归一化,得到归一化互信息(NMI)。NMI值的计算公式为:
其中,I(X;Y)为两个变量的互信息,H(X)、H(Y)分别为两个变量的信息熵。
I(X;Y)、H(X)、H(Y)的计算公式为:
其中,P(X,Y)为两个随机变量X、Y的联合分布,P(X)、P(Y)为两个随机变量X,Y的边缘分布。归一化的目的是将互信息的取值范围映射到[0,1]之间。其中,NMI=0表示X和Y完全独立,NMI=1表示可以通过X完全确定Y。NMI值越大,表示X和Y之间的相关性越强。在本方法中,X为每一个特征在衡量每一对克隆对相似度时得到的计算特征值,Y为一组代码片段是否为克隆对,克隆对则为1,非克隆对则为0。NMI值越大,则说明该特征与是否克隆相关性越强。
(3)DistanceCorrelation算法:距离相关系数是特征工程中的重要方法。距离相关系数是为了克服Pearson相关系数的弱点而生的。在一些情况下,即便Person相关系数为0,也不能断定这两个变量是独立的,因为他们可能是非线性相关的。但是如果距离相关系数为0,那么就可以说这两个变量是独立的。利用DistanceCorrelation可以研究两个变量u和v的独立性,记为dCor(u,v)。
dCor(u,v)的计算公式为:
dCov表示距离协方差;
和/>表示数据矩阵按行或列的零均值化(中心化)。按行零均值化:计算每行的平均值,然后将每个元素减去对应行的平均值,这使得每一行的均值为零。按列零均值化:计算每列的平均值,然后将每个元素减去对应列的平均值,这使得每一列的均值为零。
式中,a ij b ij 分别表示矩阵A、B中的元素,n、m分别表示向量A(B)的行数和列数。
当dCor(u,v)=0时,说明u和v相互独立。dCor(u,v)越大,说明u和v的相关性越强。在本发明中,u为每一个特征在衡量每一对克隆对相似度时得到的计算特征值,v为一组代码片段是否为克隆对,克隆对则为1,非克隆对则为0。dCor(u,v)值越大,则说明该特征与是否克隆相关性越强。
对于每个特征X,X与它对应的类Y之间的相关性可以通过上述三种计算方法,得出计算结果。在每一种算法得到的结果中,分别将计算结果为0的特征进行过滤。结果表明,使用T-test、Normalized Mutual Information、DistanceCorrelation三种算法对1972个特征过滤后分别剩余1005、1005、1025个特征。对这些过滤后的特征对应的计算结果做归一化处理,即得到每一种算法过滤后每一个特征在[0,1]内的得分情况。接着,对三种算法过滤后的特征取并集,一共得到1029个特征。同时计算得到每一个特征对应三种算法计算结果归一化后的平均值。这样,就可以按照得到的平均值大小,即特征对是否克隆影响程度的大小,对1029个过滤后的特征按照由大到小进行排序。
(二)特征筛选:
对于过滤得到的1029个特征,特征的数量仍然有些庞大。因此,为了进一步的减小特征量,提高检测效率,进一步对1029个特征进行特征筛选。特征筛选的目标是获得一个包含少量特征但可以最大程度保持模型预测能力的特征子集。特征筛选关注的是选择对特定模型最重要的特征。
这里选择了随机森林算法(RandomForest)、KNN-1、KNN-3、决策树(Decisiontree)、极端梯度提升分类算法(Xgboost classifier)、迭代算法(AdaBoost)等经典机器学习算法来进行特征筛选。
将排序后的1029个特征,依次取前n (n从1到1029)个特征,并使用10倍交叉验证方法对各算法进行训练(即每次训练中选择9/10的数据作为训练集,1/10的数据作为测试集),这样重复10次,以10次测量得到的F1分数的平均值作为最终的F1分数;从而得到每一种算法对应的F1得分变化的曲线图。
对每一种算法得到的曲线图进行分析可以发现,在特征数达到特定值时,F1分数趋于平稳,基本保持不变;图3给出了极端梯度提升分类算法训练得到的F1分数。为了衡量F1分数是否达到平稳,本实施例按照一定连续特征数(例如每连续50个特征)的F1分数的方差大小来对F1是否达到平稳进行判断。经分析极端梯度提升分类算法(Xgboostclassifier)效果最好,所以选择极端梯度提升分类算法(Xgboost classifier)作为本发明的筛选算法。最终确定了456个特征。
S5 依据选择的特征,通过分类模型判断两代码段是否存在克隆关系。
使用本实施例提供的基于马尔可夫链模型的代码克隆检测方法在此领域公认的两个有效数据集BigCloneBench和GoogleCodeJam上进行测试。
本实施例选择极端梯度提升分类算法(Xgboost classifier)作为分类模型,同样采用10倍交叉验证方法,分别利用数据集BigCloneBench和GoogleCodeJam,通过步骤S3确定的456个特征对分类模型进行训练和测试,以10次测量得到的R、P和F1分数的平均值作为测试结果。
本实施例在数据集BigCloneBench和GoogleCodeJam上的测试结果见表2所示。与传统算法相比,本发明提供的基于马尔可夫链模型的代码克隆检测方法具有很高的检测精度,其中对语义克隆类型(type4类型)检测效果尤为明显,且具有很好的可扩展性。此外,根据表3,本发明提供的代码克隆检测方法在CPU上的训练耗时只有1216±81s,测试耗时只有19±1s,具有很高的检测效率。
表2 不同算法在数据集BigCloneBench和GoogleCodeJam上的代码克隆测试结果
注:1)RtvNN表示使用Recurrent Neural Networks(RNN)来学习源代码标识符嵌入向量的方法模型;首先将代码中的函数名、类名、变量名等转换为特定的标记,并使用递归神经网络获得代码标记的嵌入向量;然后,使用递归自编码器将AST编码为隐式向量;最后,结合标记的嵌入向量和AST的隐式向量来确定代码是否相似;
2)SCDetector表示基于语义标记分析的软件功能克隆检测;将基于令牌的方法的可扩展性与基于图的方法的准确性相结合,用于软件功能克隆检测;将程序控制流图视为一个社交网络,并应用社交网络中心性分析来挖掘每个基本块的中心性;然后对一个基本块中的每个令牌分配中心性,并对同一令牌在不同基本块中的中心性求和;通过这种方式,图被转换成具有图细节(即中心性)的某些标记,称为语义标记;最后,将这些语义标记输入到神经网络中来训练克隆检测器;
3)DeepSim表示一个基于语义的方法并应用了深度网络来评估功能性代码相似度的方法;将代码控制流图和数据流图编码为语义矩阵;矩阵中的每一行都是一个稀疏的二进制向量;它利用前馈神经网络将语义矩阵转化为向量来表示代码的隐式特征,从而将代码相似度检测问题转化为二值分类问题;
4)FCCA表示使用注意力的功能代码克隆检测器,这是一种基于深度学习的代码克隆检测方法,基于混合代码表示,通过保留多个代码特征,包括非结构化(顺序令牌形式的代码)和结构化(抽象语法树和控制流图形式的代码)信息;将多个代码特征融合成一个混合表示,该混合表示具有关注机制,该机制关注重要的代码部分和有助于最终检测准确性的特征;
5)ASTNN表示基于抽象语法树(AST)的神经网络模型,将每个大型AST拆分为一系列小型语句树,并通过捕获语句的词汇和语法知识将语句树编码为向量;基于语句向量序列,使用双向RNN模型来利用语句的自然度,并最终生成代码片段的向量表示;
6)TBCNN表示一种用于编码语言处理的基于树的卷积神经网络,在程序的抽象语法树上设计了卷积核来捕获结构信息;
7)CDLH代表一个使用Tree-LSTM的功能性克隆检测器,CDLH是一种用于功能克隆检测的端到端深度特征学习框架;这种框架通过利用词汇和语法信息来快速计算代码片段之间的功能相似性来学习哈希码;将克隆检测公式化为监督学习到哈希问题;通过学习有监督的深层特征来解决软件代码功能克隆检测。
表3不同算法在数据集GoogleCodeJam上分析一百万代码对完成时间
因此,本发明提供的基于马尔可夫链模型的代码克隆检测方法,对于待匹配的两代码段,按照前面给出的步骤S1-S3操作,提取特征向量,再通过步骤S4,依据确定的456个特征对特征向量进行选择;然后通过步骤S5将选择的456个特征对应的计算特征值输入到分类模型中进行分类,得到分类结果,即存在克隆关系或不存在克隆关系。

Claims (8)

1.一种基于马尔可夫链模型的代码克隆检测方法,其特征在于,包括以下步骤:
S1 将待匹配的两代码段生成抽象语法树AST;
S2 对于每个AST,将AST中的节点按照每连续的三个节点为一组进行拆分;基于马尔可夫链,构建每个AST的状态转移矩阵,并将其转化为转移概率矩阵;本步骤包括以下分步骤:
S21 将AST中的节点按照连续的三个节点为一组进行拆分;前两个连续的节点作为马尔可夫链状态转换的初始状态,另外一个节点作为马尔可夫链状态转换中的另一状态;
S22 基于马尔可夫链状态转换中的两个状态构建状态转移矩阵;
S23 将状态转移矩阵转化为转移概率矩阵;
S3 计算得到的两个AST对应的转移概率矩阵之间的距离向量,并以得到的距离向量作为提取的特征向量;
S4 对提取的特征向量进行选择;通过训练集确定若干特征,具体为:
首先采用至少一种特征过滤算法对训练集中样本经步骤S1-S3提取的特征向量进行过滤;所述特征过滤算法包括T-test、归一化互信息、距离相关性;
之后采用机器学习算法对过滤后的特征进行筛选;所述机器学习算法为随机森林算法、KNN-1、KNN-3、决策树、极端梯度提升分类算法、迭代算法中的一种;
S5 依据选择的特征,通过分类模型判断两代码段是否存在克隆关系。
2.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S1,应用静态分析工具得到两个代码段对应的AST。
3.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S2,基于马尔可夫链原理将AST转换为状态转移概率矩阵。
4.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S21中,以节点类型表征节点状态。
5.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S22中,状态转移矩阵中的元素matrix[i][j]的值表示AST中第i个初始状态转换为第j个下一状态的次数。
6.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S23中,假设状态转移矩阵为M1,则状态转移概率矩阵M2元素的计算公式为:
式中,K表示状态转移矩阵M1的列数。
7.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S3,采用两种以上的距离计算方法对两个AST对应的转移概率矩阵之间的对应行向量进行距离计算,并将不同方法计算得到的距离向量在维度上进行拼接。
8.根据权利要求1所述的基于马尔可夫链模型的代码克隆检测方法,其特征在于,步骤S5,采用的分类模型为随机森林算法、KNN-1、KNN-3、决策树、极端梯度提升分类算法、迭代算法中的一种。
CN202311718616.8A 2023-12-14 2023-12-14 一种基于马尔可夫链模型的代码克隆检测方法 Active CN117435246B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202311718616.8A CN117435246B (zh) 2023-12-14 2023-12-14 一种基于马尔可夫链模型的代码克隆检测方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202311718616.8A CN117435246B (zh) 2023-12-14 2023-12-14 一种基于马尔可夫链模型的代码克隆检测方法

Publications (2)

Publication Number Publication Date
CN117435246A CN117435246A (zh) 2024-01-23
CN117435246B true CN117435246B (zh) 2024-03-05

Family

ID=89551766

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202311718616.8A Active CN117435246B (zh) 2023-12-14 2023-12-14 一种基于马尔可夫链模型的代码克隆检测方法

Country Status (1)

Country Link
CN (1) CN117435246B (zh)

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10754959B1 (en) * 2017-01-20 2020-08-25 University Of South Florida Non-linear stochastic models for predicting exploitability
CN112215013A (zh) * 2020-11-02 2021-01-12 天津大学 一种基于深度学习的克隆代码语义检测方法
CN115878177A (zh) * 2022-11-15 2023-03-31 北京理工大学 一种代码克隆检测方法及系统
CN116302089A (zh) * 2023-05-23 2023-06-23 华中科技大学 基于图片相似度的代码克隆检测方法、系统及存储介质
CN116661805A (zh) * 2023-07-31 2023-08-29 腾讯科技(深圳)有限公司 代码表示的生成方法和装置、存储介质及电子设备
CN116663019A (zh) * 2023-07-06 2023-08-29 华中科技大学 一种源代码漏洞检测方法、装置和系统

Family Cites Families (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10628130B2 (en) * 2018-03-29 2020-04-21 Microsoft Technology Licensing, Llc. Code completion of custom classes with machine learning
CN117940894A (zh) * 2021-08-28 2024-04-26 华为技术有限公司 用于检测代码克隆的系统和方法

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US10754959B1 (en) * 2017-01-20 2020-08-25 University Of South Florida Non-linear stochastic models for predicting exploitability
CN112215013A (zh) * 2020-11-02 2021-01-12 天津大学 一种基于深度学习的克隆代码语义检测方法
CN115878177A (zh) * 2022-11-15 2023-03-31 北京理工大学 一种代码克隆检测方法及系统
CN116302089A (zh) * 2023-05-23 2023-06-23 华中科技大学 基于图片相似度的代码克隆检测方法、系统及存储介质
CN116663019A (zh) * 2023-07-06 2023-08-29 华中科技大学 一种源代码漏洞检测方法、装置和系统
CN116661805A (zh) * 2023-07-31 2023-08-29 腾讯科技(深圳)有限公司 代码表示的生成方法和装置、存储介质及电子设备

Non-Patent Citations (8)

* Cited by examiner, † Cited by third party
Title
Normalized mutual information feature selection for electroencephalogram data based on grassberger entropy estimator;Xiaowei Zhang;《2017 IEEE International Conference on Bioinformatics and Biomedicine (BIBM)》;20171218;1-5 *
Yueming Wu.Detecting Semantic Code Clones by Building AST-based Markov Chains Model.《ASE '22: Proceedings of the 37th IEEE/ACM International Conference on Automated Software Engineering》.2012,1-13. *
Yutao Hu.Code2Img: Tree-Based Image Transformation for Scalable Code Clone Detection.《IEEE Transactions on Software Engineering ( Volume: 49, Issue: 9, 01 September 2023)》.2023,1-10. *
一种基于系统行为序列特征的Android恶意代码检测方法;杨吉云;陈钢;鄢然;吕建斌;;重庆大学学报;20200915(第09期);1-4 *
万泽轩.基于依赖增强的分层抽象语法树的代码克隆检测.《计算机应用》.2023,1-13. *
周克强.基于机器学习的源代码漏洞挖掘.《中国优秀硕士学位论文全文数据库 (信息科技辑)》.2021,1-6. *
基于Ad-Sim算法的代码克隆检测方法;王卫红;谷永亮;毛怡伟;张政豪;;浙江工业大学学报;20190614(第04期);1-6 *
基于代码变更检测的软件演化评估技术;刘辉辉;《中国博士学位论文全文数据库 (信息科技辑)》;20200515;I138-5 *

Also Published As

Publication number Publication date
CN117435246A (zh) 2024-01-23

Similar Documents

Publication Publication Date Title
CN108446540B (zh) 基于源代码多标签图神经网络的程序代码抄袭类型检测方法与系统
CN111159223B (zh) 一种基于结构化嵌入的交互式代码搜索方法及装置
CN105868108A (zh) 基于神经网络的指令集无关的二进制代码相似性检测方法
CN113761893B (zh) 一种基于模式预训练的关系抽取方法
CN113127339B (zh) 一种Github开源平台数据的获取方法及源代码缺陷修复系统
CN112733156A (zh) 基于代码属性图的软件脆弱性智能检测方法、系统及介质
CN113961241A (zh) 一种基于gat图神经网络模型的代码克隆检测方法
CN113609488B (zh) 基于自监督学习及多通道超图神经网络的漏洞检测方法与系统
Hu et al. A graph convolutional network with multiple dependency representations for relation extraction
Ji et al. Code clone detection with hierarchical attentive graph embedding
CN113742396B (zh) 一种对象学习行为模式的挖掘方法及装置
CN117787253B (zh) 基于双门控机制和依赖导向注意力网络的三元组抽取方法
CN115146062A (zh) 融合专家推荐与文本聚类的智能事件分析方法和系统
CN114218580A (zh) 一种基于多任务学习的智能合约漏洞检测方法
CN117435246B (zh) 一种基于马尔可夫链模型的代码克隆检测方法
Feng et al. Sia-RAE: a siamese network based on recursive autoencoder for effective clone detection
CN116662991A (zh) 基于人工智能的智能合约意图检测方法
CN111562943B (zh) 一种基于事件嵌入树及gat网络的代码克隆检测方法和装置
CN117390130A (zh) 一种基于多模态表示的代码搜索方法
Phan et al. Exploiting tree structures for classifying programs by functionalities
Ousmane et al. Detecting anti-patterns in SQL queries using text classification techniques
Zhang et al. Research Review of Design Pattern Mining
Ouyang et al. Binary vulnerability mining based on long short-term memory network
CN118585996B (zh) 一种基于大语言模型的恶意挖矿软件检测方法
CN117349186B (zh) 一种基于语义流图的程序语言缺陷定位方法、系统及介质

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant