CN112764758A - 代码坏味道检测方法和装置 - Google Patents

代码坏味道检测方法和装置 Download PDF

Info

Publication number
CN112764758A
CN112764758A CN202110079933.4A CN202110079933A CN112764758A CN 112764758 A CN112764758 A CN 112764758A CN 202110079933 A CN202110079933 A CN 202110079933A CN 112764758 A CN112764758 A CN 112764758A
Authority
CN
China
Prior art keywords
code
layer
bad taste
taste detection
text
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.)
Pending
Application number
CN202110079933.4A
Other languages
English (en)
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.)
Industrial and Commercial Bank of China Ltd ICBC
Original Assignee
Industrial and Commercial Bank of China Ltd ICBC
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 Industrial and Commercial Bank of China Ltd ICBC filed Critical Industrial and Commercial Bank of China Ltd ICBC
Priority to CN202110079933.4A priority Critical patent/CN112764758A/zh
Publication of CN112764758A publication Critical patent/CN112764758A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/43Checking; Contextual analysis
    • G06F8/436Semantic checking
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/04Architecture, e.g. interconnection topology
    • G06N3/049Temporal neural networks, e.g. delay elements, oscillating neurons or pulsed inputs
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06NCOMPUTING ARRANGEMENTS BASED ON SPECIFIC COMPUTATIONAL MODELS
    • G06N3/00Computing arrangements based on biological models
    • G06N3/02Neural networks
    • G06N3/08Learning methods

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • Computational Linguistics (AREA)
  • Software Systems (AREA)
  • General Physics & Mathematics (AREA)
  • Data Mining & Analysis (AREA)
  • Biophysics (AREA)
  • Evolutionary Computation (AREA)
  • General Health & Medical Sciences (AREA)
  • Molecular Biology (AREA)
  • Computing Systems (AREA)
  • Biomedical Technology (AREA)
  • Artificial Intelligence (AREA)
  • Mathematical Physics (AREA)
  • Life Sciences & Earth Sciences (AREA)
  • Health & Medical Sciences (AREA)
  • Machine Translation (AREA)

Abstract

本发明提供一种代码坏味道检测方法和装置,可用于金融领域或其他领域,该方法包括:对获取的待检代码类进行特征提取得到该待检代码类的文本特征和结构特征;将该文本特征和该结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将该代码坏味道检测模型的输出作为该待检代码类的坏味道检测结果。其中,在考虑代码的结构特征的基础上,进一步考虑了代码的语义特征,能够提高代码坏味道检测的查准率和查全率。

Description

代码坏味道检测方法和装置
技术领域
本发明涉及软件工程技术领域,尤其涉及一种代码坏味道检测方法和装置。
背景技术
随着互联网行业软件开发的规模越来越大,对软件质量和管理的要求也越来越高,开发人员需要对愈发庞大复杂的程序框架进行扩展和维护,花在代码结构梳理与改善上的时间也越来越多。因此,迫切需要采取一些优化措施来提高代码的可复用性、可理解性与维护性,软件重构应运而生。
软件重构的关键步骤之一是明确需要重构的代码片段。为了帮助开发人员确定需在程序中的何处进行重构操作,Fowler等人提出了代码坏味道的概念,意指这些由于设计缺陷或者不良的编码习惯而引入程序的、影响软件结构和质量的程序代码。代码的坏味道是代码之中潜在问题的警示信号,虽然并非所有的坏味道所指示的确实是问题,但是对于大多数坏味道,均很有必要加以查看,并作出相应的修改。代码的坏味道包括数据类、特征依恋、长方法等。
测试代码坏味道是指单元测试代码中的不良编程实践(例如,测试用例的组织方式,实现方式以及彼此之间的交互方式),它们表明测试源代码中潜在的设计问题。目前,研究人员提出了一系列的自动或半自动的方法以从代码中检测这些代码坏味道。目前的主要代码坏味道检测方法和工具,包括JDeodorant、iPlasma和PMD等,主要依靠代码度量和启发式规则来检测各种各样的代码坏味道。由于代码度量并不能完全反应代码的质量,简单的启发式规则也不足以准确描述代码度量与代码坏味道检查结果之间的复杂映射关系;且代码度量的选择带有强烈的主观性,选中的代码度量项可能并非最佳选择。因此这些检测方法的查准率和查全率都不够理想,目前难以在工业界广泛应用。
发明内容
针对现有技术中的问题,本发明提供一种代码坏味道检测方法和装置、电子设备以及计算机可读存储介质,能够至少部分地解决现有技术中存在的问题。
为了实现上述目的,本发明采用如下技术方案:
第一方面,提供一种代码坏味道检测方法,包括:
对获取的待检代码类进行特征提取得到该待检代码类的文本特征和结构特征;
将该文本特征和该结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将该代码坏味道检测模型的输出作为该待检代码类的坏味道检测结果。
进一步地,该代码坏味道检测模型包括:文本输入层、结构输入层、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
该文本输入层的输入端用于接收该文本特征,输出端连接该LSTM层;该结构输入层的输入端用于接收该结构特征,输出端连接该第一Dense全连接层;该LSTM层的输出端和该第一Dense全连接层的输出端连接该Merge融合层的输入端,该Merge融合层的输出端连接该第二Dense全连接层的输入端,该第二Dense全连接层的输出端连接该输出层。
进一步地,还包括:
建立一代码坏味道检测模型;
对开源软件代码进行反重构并自动生成标签得到样本数据;
对该样本数据中的每个样本进行文本特征提取和结构特征提取得到训练样本集;
应用该训练样本集对建立的代码坏味道检测模型进行训练。
进一步地,还包括:
对开源的代码坏味数据集进行文本特征提取和结构特征提取得到测试样本集;
应用该测试样本集对该代码坏味道检测模型进行测试。
进一步地,该结构特征包括:WMC类内圈复杂度、TCC类内内聚性、FEW类访问外部类属性的个数、AFTD使用外部属性的个数、LAA用本地属性的值/上方法使用所有属性的值、NOPA类的公共属性的个数、NOPA类的访问器的个数、NProtM类的公共成员个数、BOvR基类方法覆盖率。
进一步地,该待检代码类包括多个代码行,采用Word2vector的Skip-Gram模型提取各代码行的语义特征向量,将各代码行的语义特征向量组合得到该文本特征。
第二方面,提供一种代码坏味道检测装置,包括:
文本结构特征提取模块,对获取的待检代码类进行特征提取得到该待检代码类的文本特征和结构特征;
代码坏味道检测模块,将该文本特征和该结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将该代码坏味道检测模型的输出作为该待检代码类的坏味道检测结果。
进一步地,该代码坏味道检测模型包括:文本输入层、结构输入层、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
该文本输入层的输入端用于接收该文本特征,输出端连接该LSTM层;该结构输入层的输入端用于接收该结构特征,输出端连接该第一Dense全连接层;该LSTM层的输出端和该第一Dense全连接层的输出端连接该Merge融合层的输入端,该Merge融合层的输出端连接该第二Dense全连接层的输入端,该第二Dense全连接层的输出端连接该输出层。
第三方面,提供一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,该处理器执行该程序时实现上述的代码坏味道检测方法的步骤。
第四方面,提供一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述的代码坏味道检测方法的步骤。
本发明提供的代码坏味道检测方法和装置,该方法包括:对获取的待检代码类进行特征提取得到该待检代码类的文本特征和结构特征;将该文本特征和该结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将该代码坏味道检测模型的输出作为该待检代码类的坏味道检测结果。其中,在考虑代码的结构特征的基础上,进一步考虑了代码的语义特征,能够提高代码坏味道检测的查准率和查全率,可用于金融领域或其他领域。
另外,该代码坏味道检测模型基于LSTM,利用深度学习擅长特征选择以及建立复杂映射关系的特点提取出文本信息,同时结合多个结构度量项,综合评判待检测程序是否包含代码坏味,不仅为开发者节省大量软件维护和拓展的时间精力成本,延长软件的生命周期,还能够通过改善代码逻辑来增强代码理解,以便更好地从中发现程序缺陷。
再者,本发明中对开源软件代码进行反重构并自动生成标签得到样本数据,解决训练数据集需要手工构造、耗时巨大且规模偏小、难以发挥深度学习的问题。
为让本发明的上述和其他目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附图式,作详细说明如下。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图是本申请的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。在附图中:
图1为本发明实施例中的服务器S1与客户端设备B1之间的架构示意图;
图2为本发明实施例中的服务器S1、客户端设备B1及数据库服务器S2之间的架构示意图;
图3是本发明实施例中的代码坏味道检测方法的流程示意图一;
图4示出了本发明实施例中代码坏味道检测模型的具体结构;
图5是本发明实施例中的代码坏味道检测方法的流程示意图二;
图6示出了本发明实施例中自动构建代码坏味样例的一种示例;
图7示出了本发明实施例中自动构建代码坏味样例的另一种示例;
图8是本发明实施例中的代码坏味道检测方法的流程示意图三;
图9示出了本发明实施例中的一种代码坏味检测工作流程;
图10是本发明实施例中的代码坏味道检测装置的结构框图;
图11为本发明实施例电子设备的结构图。
具体实施方式
为了使本技术领域的人员更好地理解本申请方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分的实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本申请保护的范围。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
需要说明的是,本申请的说明书和权利要求书及上述附图中的术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本申请。
目前,研究人员提出了一系列的自动或半自动的方法以从代码中检测这些代码坏味道。目前的主要代码坏味道检测方法和工具,包括JDeodorant、iPlasma和PMD等,主要依靠代码度量和启发式规则来检测各种各样的代码坏味道。由于代码度量并不能完全反应代码的质量,简单的启发式规则也不足以准确描述代码度量与代码坏味道检查结果之间的复杂映射关系;且代码度量的选择带有强烈的主观性,选中的代码度量项可能并非最佳选择。因此这些检测方法的查准率和查全率都不够理想,目前难以在工业界广泛应用。
本发明提供一种代码坏味道检测方法,在考虑代码的结构特征的基础上,进一步考虑了代码的语义特征,能够提高代码坏味道检测的查准率和查全率。
有鉴于此,本申请提供了一种代码坏味道检测装置,该装置可以为一种服务器S1,参见图1,该服务器S1可以与至少一个客户端设备B1通信连接,所述客户端设备B1可以将待检代码类发送至所述服务器S1,所述服务器S1可以在线接收所述待检代码类。所述服务器S1可以在线或者离线对获取的待检代码类进行预处理,对获取的待检代码类进行特征提取得到所述待检代码类的文本特征和结构特征;将所述文本特征和所述结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将所述代码坏味道检测模型的输出作为所述待检代码类的坏味道检测结果。而后,所述服务器S1可以将待检代码类的坏味道检测结果在线发送至所述客户端设备B1。所述客户端设备B1可以在线接收所述待检代码类的坏味道检测结果。
另外,参见图2,所述服务器S1还可以与至少一个数据库服务器S2通信连接,所述数据库服务器S2用于存储开源软件代码。所述数据库服务器S2在线将所述开源软件代码发送至所述服务器S1,所述服务器S1可以在线接收所述开源软件代码,而后根据开源软件代码获取该模型的训练样本集,应用所述训练样本集对所述模型进行模型训练。
基于上述内容,所述数据库服务器S2还可以用于存储开源的代码坏味数据集。所述数据库服务器S2在线将所述开源的代码坏味数据集发送至所述服务器S1,所述服务器S1可以在线接收所述开源的代码坏味数据集,而后根据至少开源的代码坏味数据集得到测试样本,并应用所述测试样本对所述模型进行模型测试,并将该模型的输出作为测试结果,再基于所述测试结果及测试样本的已知评价结果,判断当前模型是否符合预设要求,若是,则将当前模型作为用于代码坏味道检测的目标模型;若当前模型不符合所述预设要求,则对当前模型进行优化和/或应用更新后的训练样本集重新对该模型进行模型训练。
基于上述内容,所述客户端设备B1可以具有显示界面,使得用户能够根据界面查看所述服务器S1发送的所述待检代码类的坏味道检测结果。
可以理解的是,所述客户端设备B1可以包括智能手机、平板电子设备、网络机顶盒、便携式计算机、台式电脑、个人数字助理(PDA)、车载设备、智能穿戴设备等。其中,所述智能穿戴设备可以包括智能眼镜、智能手表、智能手环等。
在实际应用中,进行待检代码类的坏味道检测的部分可以在如上述内容所述的服务器S1侧执行,即,如图1所示的架构,也可以所有的操作都在所述客户端设备B1中完成,且该所述客户端设备B1可以直接与数据库服务器S2进行通信连接。具体可以根据所述客户端设备B1的处理能力,以及用户使用场景的限制等进行选择。本申请对此不作限定。若所有的操作都在所述客户端设备B1中完成,所述客户端设备B1还可以包括处理器,用于进行待检代码类的坏味道检测的具体处理。
所述服务器与所述客户端设备之间可以使用任何合适的网络协议进行通信,包括在本申请提交日尚未开发出的网络协议。所述网络协议例如可以包括TCP/IP协议、UDP/IP协议、HTTP协议、HTTPS协议等。当然,所述网络协议例如还可以包括在上述协议之上使用的RPC协议(Remote Procedure Call Protocol,远程过程调用协议)、REST协议(Representational State Transfer,表述性状态转移协议)等。
图3是本发明实施例中的代码坏味道检测方法的流程示意图一;如图3所示,该代码坏味道检测方法可以包括以下内容:
步骤S100:对获取的待检代码类进行特征提取得到所述待检代码类的文本特征和结构特征;
申请人通过大量研究成果证明挖掘待检代码类的文本特征有利于提高代码坏味检测的准确率,因此本发明实施例将文本特征作为神经网络分类器的两部分输入之一,可通过词向量的方式表征待检代码类的语义信息。
另外,可在语义信息的基础上,结合距离、耦合度、圈复杂度等多个结构度量项,综合评判待检测程序是否包含代码坏味。
步骤S200:将所述文本特征和所述结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将所述代码坏味道检测模型的输出作为所述待检代码类的坏味道检测结果。
其中,代码坏味道检测模型是一种深度学习神经网络分类器,其输入有两个,即文本特征和结构特征,输出结果有两种,一种是表征存在代码坏味,另一种是表征不存在代码坏味,比如,可通过0表示不存在代码坏味、1表示存在代码坏味。
值得说明的是,本发明实施例利用深度学习擅长特征选择以及建立复杂映射关系的特点提取出文本信息,同时结合距离、耦合度、圈复杂度等多个度量项,综合评判待检测程序是否包含代码坏味。该方法不仅为开发者节省大量软件维护和拓展的时间精力成本,延长软件的生命周期,还能够通过改善代码逻辑来增强代码理解,以便更好地从中发现程序缺陷。
在一个可选的实施例中,可以9个相关度量项作为代码结构信息,以类内成员标识符作为代码文本信息,作为模型的输入,如以下公式所示:
input=<identifies,metrics>
identifies={name(m1),name(m2),...,name(mn)}
metrics={metric1,metric2,...,metric9}
首先,需要从源代码类中提取一些能够代表代码特征的指标,在计算和分析后获取一系列的度量。针对目标坏味,在现有研究基础上本发明采用9个相关度量项作为代码结构信息,分别如下。
1)WMC类内圈复杂度;
2)TCC类内内聚性;
3)FEW该类访问外部类属性的个数;
4)AFTD方法使用外部属性的个数;
5)LAA方法是用本地属性的值/上方法使用所有属性的值;
6)NOPA类的公共属性的个数;
7)NOPA类的访问器的个数;
8)NProtM类的公共成员个数;
9)BOvR基类方法覆盖率,即基类重写的继承方法数/继承的总成员数。
其次,对于文本特征,可采用著名词向量化工具Word2vector的Skip-Gram模型,它是从大量文本语料中以无监督的方式学习语义知识的一种双层神经网络模型,输入是文本语料,输出则是该语料中词语的特征向量。它通过学习文本来用词向量的方式表征词的语义信息,将标识符中的词语映射到高纬向量空间,通过一个嵌入空间使得语义上相似的单词在该空间内距离很近。以词本身作为输入,而一个词所在的上下文中的词作为输出。最终将测试数据的文本特征转换为神经网络可以识别的词向量的形式。
具体地,待检代码类包括多个代码行,采用Word2vector的Skip-Gram模型提取各代码行的语义特征向量,将各代码行的语义特征向量组合得到所述文本特征。
在一个可选的实施例中,参见图4,该代码坏味道检测模型包括:文本输入层(即用于接收Identifiers的Input层)、结构输入层(即用于接收Code Metrics的Input层)、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
所述文本输入层的输入端用于接收所述文本特征,输出端连接所述LSTM层;所述结构输入层的输入端用于接收所述结构特征,输出端连接所述第一Dense全连接层;所述LSTM层的输出端和所述第一Dense全连接层的输出端连接所述Merge融合层的输入端,所述Merge融合层的输出端连接所述第二Dense全连接层的输入端,所述第二Dense全连接层的输出端连接所述输出层。
其中,输入的文本特征由代码文本信息组成,待检测代码类经过预处理后,由文本信息转为数值信息,将以词向量的形式经过输入LSTM层所包括的Masking数据屏蔽层,LSTM层是一种LSTM长短时记忆网络,LSTM层激活函数为sigmoid函数,输出维度为2,并对该层权重做均匀分布初始化。长短时记忆网络作为RNN循环神经网络的变体,通过规避梯度消失问题弥补了循环神经网络长期记忆失效的缺陷,因而在自然语言处理领域中获得了充分应用。本发明利用长短时记忆网络善于从长序列中提取关键语义特征的优势来对所输入的多个标识符词向量进行处理,以帮助分类器分析被检测类在语义上的内聚性。
输入的结构特征体现了被检测类的结构特征。通过将从类中提取出的9个度量值输入Dense全连接层,分类器可以在有监督的情况下对输入进行迭代训练,逐步调整出与训练集标签最匹配的参数组合,其中全连接层激活函数为tanh函数,输出维度为12,并对本层权重做均匀分布初始化。之后第一Dense全连接层和LSTM层的输出会经由Merge融合层以向量拼接的形式合并,再由一层全连接层映射到最终的Sigmoid输出层,此间的全连接层激活函数为tanh函数,输出维度为4,权重初始化为全零矩阵;输出层激活函数为sigmoid函数,输出维度为1。最终选取的模型损失函数为binary_crossentropy函数,优化器为adam自适应方法,迭代次数为10次,批尺寸为5。
通过采用上述的代码坏味道检测模型,基于LSTM,利用深度学习擅长特征选择以及建立复杂映射关系的特点提取出文本信息,同时结合多个结构度量项,综合评判待检测程序是否包含代码坏味,不仅为开发者节省大量软件维护和拓展的时间精力成本,延长软件的生命周期,还能够通过改善代码逻辑来增强代码理解,以便更好地从中发现程序缺陷。
在一个可选的实施例中,参见图5,该代码坏味道检测方法还可以包括:
步骤S300:建立一代码坏味道检测模型;
步骤S400:对开源软件代码进行反重构并自动生成标签得到样本数据;
神经网络通常包含大量参数,需要通过大量训练数据来进行参数调优。要将神经网络应用于代码坏味检测首先必须解决海量训练数据的构造问题。如果手工构造代码坏味检测数据集,耗时巨大且规模偏小,难以发挥深度学习的优势。为此,本发明提出一种基于反重构的训练样本自动生成技术,可以自动生成大量带标签的正负训练样本,为研究基于神经网络的代码坏味检测与重构方法奠定了基础。
本发明选取了目前最常见、影响最广的五种典型坏味作为研究对象,分别是:Refused Bequest是一种对继承结构的错误使用,Feature Envy指数据与对其的操作行为未被封装在一起的情况,Data Class指需要被其他类频繁操作的数据容器类,God Class违反了单一职责原则,Unnecessary Coupling指文件中引入了不必要的耦合关系。首先,从Github等开源网站下载数个受欢迎程度排序靠前的软件系统,作为开源软件代码。然后,使用Eclipse JDT插件提供的API方法,对开源软件代码进行反重构并自动生成标签得到样本数据。下面以两个实例进行反重构说明。
图6中的样例JaxenXPathRuleQuery类是一个基于Jaxen的XPathRule查询类。RuleContext类是一个提供对Rule处理状态的访问的类。evluate()方法的作用是获得关于XPath的一个列表,实现的是关于XPathRelu查询的部分功能,仅仅是用了RuleContext中的getLanguageVersion()获取其中一个变量,跟RuleContext类要执行的功能没什么关系,因而从概念上来看,应该放在JaxenXPathRuleQuery类中。依赖关系上来看,把方法evaluate()从JaxenXPathRuleQuery类移动到RuleContext类中,相比较RuleContext类来说,evluate()明显与JaxenXPathRuleQuery类更紧密。由此移动之后可自动构建成特征依恋坏味。
图7中的样例所示,可以明显看到createRule在结构中与类RuleSetReferenceId更为紧密,然而我们可以看到其源类为RuleSetFactory类,即为对RuleSet的一系列操作应放置在该类中。而RuleSetReferenceId主要是对RuleSet的参考操作,createRule方法主要为创建一个新的规则,因此,我们可以看到从语义角度来看把createRule类放在原位置更为合适。
通过Eclipse JDT的API方法,对源数据集进行五种目标类型坏味的反重构操作,自动生成训练集,其中,正样本占50%,负样本占50%。
步骤S500:对所述样本数据中的每个样本进行文本特征提取和结构特征提取得到训练样本集;
其中,文本特征提取和结构特征提取过程参见上述,在此不再赘述。
步骤S600:应用所述训练样本集对建立的代码坏味道检测模型进行训练。
具体地,将样本对应的文本特征和结构特征输入模型中,将模型的输出结果与样本对应标签进行比较,根据比较结果调整模型参数,实现模型训练。
在一个可选的实施例中,参见图8,该代码坏味道检测方法还可以包括:
步骤S700:对开源的代码坏味数据集进行文本特征提取和结构特征提取得到测试样本集;
步骤S800:应用所述测试样本集对所述代码坏味道检测模型进行测试。
通过将开源的代码坏味数据集作为测试集,输入到训练好的神经网络分类器中,分类器对所有样本进行自动二分类,从而审核模型的查准率和查全率。
如果模型的查准率和查全率符合要求,则认为模型训练完成,如果不符合要求,则需要调整模型或者重构训练集进行重新训练。
值得说明的是,本发明采用Palomba等人提出的一个基于人工验证的代码坏味大规模开源数据集作为实验验证数据,此数据集包含了在30个软件项目的395个历史版本中13种代码坏味的检测情况。
利用已有的代码坏味数据集,在项目源码中获取包含本发明的五种目标代码坏味任意一种的开源项目的程序块,以此作为测试数据中的正样本,而工程中剩余的其他类便可在测试集中被标记为负样本,就此生成针对现有工具和所提方法的测试样本集。这样的测试样本集准确可信且来源真实,可以更为贴切地展示两种方法在实际应用场景下对于代码坏味的检测结果的可靠程度。
将每个程序块下的所有测试项输入到训练好的二分类神经网络分类器中。如果所有测试项都被预测为0,那么给定的程序块不存在代码坏味;如果其中有一个及以上的测试项预测为1,则该程序块存在代码坏味。选用JDeodorant作为坏味检测对比试验对象。在实验完成之后,分别计算本模型与JDeodorant检测五种代码坏味的查准率(precision)和查全率(recall),计算公式如下所示:
Figure BDA0002908795830000111
Figure BDA0002908795830000112
综上所述,参见图9,本发明提供的代码坏味道检测技术,包括模型训练过程和利用训练后的神经网络分类模型进行检测的过程,结合了LSTM神经网络、文本和结构特征提取以及样本反重构等技术,提高代码坏味检测技术的准确性,不仅为开发者节省大量软件维护和拓展的时间精力成本,延长软件的生命周期,还能够通过改善代码逻辑来增强代码理解,以便更好地从中发现程序缺陷。另外,采用基于反重构的代码坏味正负样本自动生成技术,以互联网中基数庞大的开源项目为基础,以此方法获得足够充足的代码坏味带标签的样本集,为研究基于神经网络的代码坏味检测与重构方法奠定了基础。
基于同一发明构思,本申请实施例还提供了一种代码坏味道检测装置,可以用于实现上述实施例所描述的方法,如下面的实施例所述。由于代码坏味道检测装置解决问题的原理与上述方法相似,因此代码坏味道检测装置的实施可以参见上述方法的实施,重复之处不再赘述。以下所使用的,术语“单元”或者“模块”可以实现预定功能的软件和/或硬件的组合。尽管以下实施例所描述的装置较佳地以软件来实现,但是硬件,或者软件和硬件的组合的实现也是可能并被构想的。
图10是本发明实施例中的代码坏味道检测装置的结构框图。如图10所示,该代码坏味道检测装置具体包括:文本结构特征提取模块10以及代码坏味道检测模块20。
文本结构特征提取模块10对获取的待检代码类进行特征提取得到所述待检代码类的文本特征和结构特征;
代码坏味道检测模块20将所述文本特征和所述结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将所述代码坏味道检测模型的输出作为所述待检代码类的坏味道检测结果。
其中,利用深度学习擅长特征选择以及建立复杂映射关系的特点提取出文本信息,同时结合距离、耦合度、圈复杂度等多个度量项,综合评判待检测程序是否包含代码坏味。该方法不仅为开发者节省大量软件维护和拓展的时间精力成本,延长软件的生命周期,还能够通过改善代码逻辑来增强代码理解,以便更好地从中发现程序缺陷。
在一个可选的实施例中,所述代码坏味道检测模型包括:文本输入层、结构输入层、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
所述文本输入层的输入端用于接收所述文本特征,输出端连接所述LSTM层;所述结构输入层的输入端用于接收所述结构特征,输出端连接所述第一Dense全连接层;所述LSTM层的输出端和所述第一Dense全连接层的输出端连接所述Merge融合层的输入端,所述Merge融合层的输出端连接所述第二Dense全连接层的输入端,所述第二Dense全连接层的输出端连接所述输出层。
上述实施例阐明的装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为电子设备,具体的,电子设备例如可以为个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任何设备的组合。
在一个典型的实例中电子设备具体包括存储器、处理器以及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现下述上述的代码坏味道检测方法的步骤。
下面参考图11,其示出了适于用来实现本申请实施例的电子设备600的结构示意图。
如图11所示,电子设备600包括中央处理单元(CPU)601,其可以根据存储在只读存储器(ROM)602中的程序或者从存储部分608加载到随机访问存储器(RAM))603中的程序而执行各种适当的工作和处理。在RAM603中,还存储有系统600操作所需的各种程序和数据。CPU601、ROM602、以及RAM603通过总线604彼此相连。输入/输出(I/O)接口605也连接至总线604。
以下部件连接至I/O接口605:包括键盘、鼠标等的输入部分606;包括诸如阴极射线管(CRT)、液晶显示器(LCD)等以及扬声器等的输出部分607;包括硬盘等的存储部分608;以及包括诸如LAN卡,调制解调器等的网络接口卡的通信部分609。通信部分609经由诸如因特网的网络执行通信处理。驱动器610也根据需要连接至I/O接口605。可拆卸介质611,诸如磁盘、光盘、磁光盘、半导体存储器等等,根据需要安装在驱动器610上,以便于从其上读出的计算机程序根据需要被安装如存储部分608。
特别地,根据本发明的实施例,上文参考流程图描述的过程可以被实现为计算机软件程序。例如,本发明的实施例包括一种计算机可读存储介质,其上存储有计算机程序,该计算机程序被处理器执行时实现上述的代码坏味道检测方法的步骤。
在这样的实施例中,该计算机程序可以通过通信部分609从网络上被下载和安装,和/或从可拆卸介质611被安装。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
为了描述的方便,描述以上装置时以功能分为各种单元分别描述。当然,在实施本申请时可以把各单元的功能在同一个或多个软件和/或硬件中实现。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述的。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式处理机或其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
还需要说明的是,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、商品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、商品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、商品或者设备中还存在另外的相同要素。
本领域技术人员应明白,本申请的实施例可提供为方法、系统或计算机程序产品。因此,本申请可采用完全硬件实施例、完全软件实施例或结合软件和硬件方面的实施例的形式。而且,本申请可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本申请可以在由计算机执行的计算机可执行指令的一般上下文中描述,例如程序模块。一般地,程序模块包括执行特定任务或实现特定抽象数据类型的例程、程序、对象、组件、数据结构等等。也可以在分布式计算环境中实践本申请,在这些分布式计算环境中,由通过通信网络而被连接的远程处理设备来执行任务。在分布式计算环境中,程序模块可以位于包括存储设备在内的本地和远程计算机存储介质中。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于系统实施例而言,由于其基本相似于方法实施例,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
以上所述仅为本申请的实施例而已,并不用于限制本申请。对于本领域技术人员来说,本申请可以有各种更改和变化。凡在本申请的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本申请的权利要求范围之内。

Claims (10)

1.一种代码坏味道检测方法,其特征在于,包括:
对获取的待检代码类进行特征提取得到所述待检代码类的文本特征和结构特征;
将所述文本特征和所述结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将所述代码坏味道检测模型的输出作为所述待检代码类的坏味道检测结果。
2.根据权利要求1所述的代码坏味道检测方法,其特征在于,所述代码坏味道检测模型包括:文本输入层、结构输入层、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
所述文本输入层的输入端用于接收所述文本特征,输出端连接所述LSTM层;所述结构输入层的输入端用于接收所述结构特征,输出端连接所述第一Dense全连接层;所述LSTM层的输出端和所述第一Dense全连接层的输出端连接所述Merge融合层的输入端,所述Merge融合层的输出端连接所述第二Dense全连接层的输入端,所述第二Dense全连接层的输出端连接所述输出层。
3.根据权利要求2所述的代码坏味道检测方法,其特征在于,还包括:
建立一代码坏味道检测模型;
对开源软件代码进行反重构并自动生成标签得到样本数据;
对所述样本数据中的每个样本进行文本特征提取和结构特征提取得到训练样本集;
应用所述训练样本集对建立的代码坏味道检测模型进行训练。
4.根据权利要求3所述的代码坏味道检测方法,其特征在于,还包括:
对开源的代码坏味数据集进行文本特征提取和结构特征提取得到测试样本集;
应用所述测试样本集对所述代码坏味道检测模型进行测试。
5.根据权利要求1至4任一项所述的代码坏味道检测方法,其特征在于,所述结构特征包括:WMC类内圈复杂度、TCC类内内聚性、FEW类访问外部类属性的个数、AFTD使用外部属性的个数、LAA用本地属性的值/上方法使用所有属性的值、NOPA类的公共属性的个数、NOPA类的访问器的个数、NProtM类的公共成员个数、BOvR基类方法覆盖率。
6.根据权利要求1至4任一项所述的代码坏味道检测方法,其特征在于,所述待检代码类包括多个代码行,采用Word2vector的Skip-Gram模型提取各代码行的语义特征向量,将各代码行的语义特征向量组合得到所述文本特征。
7.一种代码坏味道检测装置,其特征在于,包括:
文本结构特征提取模块,对获取的待检代码类进行特征提取得到所述待检代码类的文本特征和结构特征;
代码坏味道检测模块,将所述文本特征和所述结构特征作为预测样本,输入预训练的代码坏味道检测模型,并将所述代码坏味道检测模型的输出作为所述待检代码类的坏味道检测结果。
8.根据权利要求7所述的代码坏味道检测装置,其特征在于,所述代码坏味道检测模型包括:文本输入层、结构输入层、LSTM层、第一Dense全连接层、Merge融合层、第二Dense全连接层以及输出层;
所述文本输入层的输入端用于接收所述文本特征,输出端连接所述LSTM层;所述结构输入层的输入端用于接收所述结构特征,输出端连接所述第一Dense全连接层;所述LSTM层的输出端和所述第一Dense全连接层的输出端连接所述Merge融合层的输入端,所述Merge融合层的输出端连接所述第二Dense全连接层的输入端,所述第二Dense全连接层的输出端连接所述输出层。
9.一种电子设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,其特征在于,所述处理器执行所述程序时实现权利要求1至6任一项所述的代码坏味道检测方法的步骤。
10.一种计算机可读存储介质,其上存储有计算机程序,其特征在于,该计算机程序被处理器执行时实现权利要求1至6任一项所述的代码坏味道检测方法的步骤。
CN202110079933.4A 2021-01-21 2021-01-21 代码坏味道检测方法和装置 Pending CN112764758A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110079933.4A CN112764758A (zh) 2021-01-21 2021-01-21 代码坏味道检测方法和装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110079933.4A CN112764758A (zh) 2021-01-21 2021-01-21 代码坏味道检测方法和装置

Publications (1)

Publication Number Publication Date
CN112764758A true CN112764758A (zh) 2021-05-07

Family

ID=75702129

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110079933.4A Pending CN112764758A (zh) 2021-01-21 2021-01-21 代码坏味道检测方法和装置

Country Status (1)

Country Link
CN (1) CN112764758A (zh)

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113703774A (zh) * 2021-08-26 2021-11-26 东南大学 一种基于依赖结构特征的Feature Envy代码坏味检测方法
CN114500071A (zh) * 2022-02-10 2022-05-13 江苏大学 一种针对目标网站动态增长的自适应指纹攻击方法和系统
CN115237817A (zh) * 2022-09-22 2022-10-25 北京大学 一种数据交换共享低代码流程的动态模型检测方法和装置
WO2023155487A1 (zh) * 2022-02-18 2023-08-24 华为云计算技术有限公司 代码重构方法及装置

Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110413319A (zh) * 2019-08-01 2019-11-05 北京理工大学 一种基于深度语义的代码函数味道检测方法
CN110502277A (zh) * 2019-08-30 2019-11-26 西安邮电大学 一种基于bp神经网络的代码坏味检测方法

Patent Citations (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN110413319A (zh) * 2019-08-01 2019-11-05 北京理工大学 一种基于深度语义的代码函数味道检测方法
CN110502277A (zh) * 2019-08-30 2019-11-26 西安邮电大学 一种基于bp神经网络的代码坏味检测方法

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113703774A (zh) * 2021-08-26 2021-11-26 东南大学 一种基于依赖结构特征的Feature Envy代码坏味检测方法
CN113703774B (zh) * 2021-08-26 2024-05-17 东南大学 一种基于依赖结构特征的Feature Envy代码坏味检测方法
CN114500071A (zh) * 2022-02-10 2022-05-13 江苏大学 一种针对目标网站动态增长的自适应指纹攻击方法和系统
CN114500071B (zh) * 2022-02-10 2024-04-16 江苏大学 一种针对目标网站动态增长的自适应指纹攻击方法和系统
WO2023155487A1 (zh) * 2022-02-18 2023-08-24 华为云计算技术有限公司 代码重构方法及装置
CN115237817A (zh) * 2022-09-22 2022-10-25 北京大学 一种数据交换共享低代码流程的动态模型检测方法和装置
CN115237817B (zh) * 2022-09-22 2022-12-16 北京大学 一种数据交换共享低代码流程的动态模型检测方法和装置

Similar Documents

Publication Publication Date Title
CN112764758A (zh) 代码坏味道检测方法和装置
Shafiq et al. A literature review of using machine learning in software development life cycle stages
GB2617045A (en) Computer-based systems, computing components and computing objects configured to implement dynamic outlier bias reduction in machine learning models
US11645548B1 (en) Automated cloud data and technology solution delivery using machine learning and artificial intelligence modeling
Sandhu et al. Software reuse analytics using integrated random forest and gradient boosting machine learning algorithm
CN114298417A (zh) 反欺诈风险评估方法、训练方法、装置及可读存储介质
Zhang et al. MARS: Detecting brain class/method code smell based on metric–attention mechanism and residual network
CN110348578A (zh) 一种安全事件情景推演构建方法、系统、设备及介质
Dey et al. Which pull requests get accepted and why? a study of popular npm packages
Javeed et al. Discovering software developer's coding expertise through deep learning
CN117435505B (zh) 一种性能测试脚本可视化生成方法
CN112598526A (zh) 资产数据的处理方法及装置
Avdeenko et al. Intelligent support of requirements management in agile environment
US12093684B2 (en) Application transition and transformation
CN116629612A (zh) 一种风险预测的方法、装置、存储介质及电子设备
CN116401372A (zh) 知识图谱表示学习方法、装置、电子设备及可读存储介质
US20230117893A1 (en) Machine learning techniques for environmental discovery, environmental validation, and automated knowledge repository generation
CN114968821A (zh) 基于强化学习的测试数据生成方法及装置
CN113448822B (zh) 测试方法、装置、计算机可读介质及电子设备
Althar et al. Application of machine intelligence-based knowledge graphs for software engineering
CN114117445A (zh) 漏洞分类方法、装置、设备及介质
Xie et al. Establishment of a fuzzy comprehensive evaluation random matrix model for the assessment of foreign language translation level in universities
CN112947928A (zh) 代码评价的方法、装置、电子设备和存储介质
Gurung Performing Software Defect Prediction Using Deep Learning
CN118393329B (zh) 一种用于测试ai芯片在模型训练和推理表现的系统

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