CN107066384A - 基于Halstead复杂度度量的软件演化评估方法 - Google Patents

基于Halstead复杂度度量的软件演化评估方法 Download PDF

Info

Publication number
CN107066384A
CN107066384A CN201710191917.8A CN201710191917A CN107066384A CN 107066384 A CN107066384 A CN 107066384A CN 201710191917 A CN201710191917 A CN 201710191917A CN 107066384 A CN107066384 A CN 107066384A
Authority
CN
China
Prior art keywords
code
halstead
software
complexity
operator
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.)
Withdrawn
Application number
CN201710191917.8A
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.)
Southeast University
Original Assignee
Southeast 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 Southeast University filed Critical Southeast University
Priority to CN201710191917.8A priority Critical patent/CN107066384A/zh
Publication of CN107066384A publication Critical patent/CN107066384A/zh
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F11/00Error detection; Error correction; Monitoring
    • G06F11/36Preventing errors by testing or debugging software
    • G06F11/3604Software analysis for verifying properties of programs

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Computer Hardware Design (AREA)
  • Quality & Reliability (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明公开了一种基于Halstead复杂度度量的软件演化评估方法,先将待评估软件源码通过代码解析生成抽象语法树;然后,根据Java语言操作符和操作数识别规则对抽象语法树中的操作符节点和操作数节点进行识别和统计,并在此基础上进行代码Halstead复杂度度量;接着,从方法层、类层和系统层三个层面对软件代码的复杂程度进行评估;最后,将软件演化前后的Halstead复杂度进行对比分析,定位复杂度变化位置,通过代码变更检测分析复杂度发生变化的原因。该发明的评估方法不仅可以自动分析源码,从软件各个层面评估代码的Halstead复杂度,对复杂度过高的模块和方法提出预警,而且可以定位引起演化中复杂度变化的位置,并分析变化原因,为软件演化评估提供参考依据。

Description

基于Halstead复杂度度量的软件演化评估方法
技术领域
本发明涉及一种基于代码Halstead复杂度度量的软件演化评估方法,属于软件演化与维护领域问题。
背景技术
代码复杂度是对代码复杂程度的一种度量,是理解和维护代码所需工作量的一种指征。代码复杂度能够反映以下六个不同方面的含义:(1)理解程序的难易程度;(2)修复代码缺陷和维护代码的难易程度;(3)向其他人解释代码的难易程度;(4)根据某些给定规则(或需求)更新代码的难易程度;(5)根据设计完成程序的难易程度;(6)程序执行时必要资源的可用性。
从软件科学的角度出发,计算机程序可以被看成是符号(token)的集合,这些符号可以由编译器识别并区分为操作符和操作数。操作数是指源程序代码中的常量和变量等;而操作符则是指用来处理程序中各个操作数的语法元素,如算术运算符、逻辑运算符、关系运算符、流程控制语句、函数调用等。Halstead复杂度根据源代码中操作数和操作符的测量值来度量源程序代码的复杂程度。通过Halstead复杂度的度量与评估可以获得程序的容量、长度、难度、预测程序bug数、工作量等,有利于管理人员对项目进行规划。
当前,软件演化成为软件生命周期中重要的一环。随着软件的演化,其源代码会产生一定的变更,这些变更会对软件的复杂程度、软件质量及其后继演化产生影响。源代码的变更必定会反映在对程序中操作符和操作数的数量统计上,因此,通过对软件演化过程中Halstead复杂度变化情况的研究分析,可以为软件的演化提供评价依据,对于软件的迭代开发与重构、延长软件的生命周期具有重要意义。
发明内容
技术问题:本发明提供一种自动化地对代码Halstead复杂度进行度量并进行演化评估,在软件演化过程中对复杂度有效控制,注重演化过程中软件Halstead复杂度的变化,实现对软件复杂度控制的基于代码Halstead复杂度度量的软件演化评估方法。
技术方案:本发明方法,引入代码Halstead复杂度度量方法及相关阈值,从不同层次对演化前后的软件进行度量和评估,进而对其Halstead复杂度变化的原因进行分析,为软件维护方案提供参考。
本发明方法包括以下步骤:
步骤1)针对待评估软件的当前版本V_current和历史版本V_last,根据源代码分别构造各个版本的抽象语法树;
步骤2)根据所述步骤1)获取的抽象语法树,分别从系统层、类层和方法层三个层次对待测软件版本的代码进行Halstead复杂度度量,所述待测软件版本包括当前待测目标版本V_current和历史版本V_last;
步骤3)从类层和方法层分别评估待测软件版本的Halstead复杂度度量结果,找出软件中Halstead复杂度超过阈值范围的类和方法;
步骤4)对待评估软件的当前版本V_current和历史版本V_last得到的Halstead复杂度度量结果按层次进行分析比较,确定其中Halstead复杂度发生变化的类和方法;
步骤5)对待评估软件的当前版本V_current和历史版本V_last的项目源码进行分析比较,找出两者的代码差异,输出到格式文件中;
步骤6)针对待评估软件当前版本V_current和历史版本V_last,通过所述步骤4)得到的两个版本中Halstead复杂度发生变化的类和方法,以及所述步骤5)得到的两个版本的代码差异,进行代码差异定位,并根据代码差异确定导致度量结果发生变化的原因,形成软件演化评估。
进一步的,本发明的方法中,步骤1)构造的抽象语法树中包含源码中操作符和操作数的解析信息,所述操作符和操作数的解析信息符合以下规则:
规则1:程序源码转化为抽象语法树后,源码中的每种结构都以抽象语法树节点的形式展现,所述结构包括操作符和操作数;
规则2:操作符为程序中完成一个动作的代码元素,所述操作符包括:
开发语言中的关键字;
软件程序中的声明;其中,面向对象开发语言中包括包的声明、类的声明、方法声明;面向过程开发语言中包括函数声明和过程声明;
总是一起出现的结构化操作符,以及结构化操作符中出现的其它符号;
方法调用或函数调用;
运算符;
规则3:操作数是指参与到操作符动作中的代码元素,所述操作数包括:
标识符,即所有的用户定义标识符;
常量,即程序中出现的各种常量;
规则4:对于以上规则中没有覆盖的符号,分号“;”是一个标点符号,表示一行代码的结束;而“//”和‘/**/’是注释相关的符号,它们既不属于操作符也不属于操作数,而且不会对代码的操作造成影响,因此在检测中不予考虑;
规则5:将以上规则应用于Java语言源码生成的抽象语法树,能够得到如下表所示的针对Java抽象语法树中操作符节点和操作数节点的划分:
表1.操作符和操作数相关的ASTNode表
进一步的,本发明的方法中,步骤2)中进行Halstead复杂度度量的规则如下:
规则1:分别从系统层、类层和方法层三个层次统计相应抽象语法树中操作符和操作数结点数目,然后进行表2所示的Halstead复杂度基本测量;
表2.Halstead复杂度基本测度表
名称 含义
n1 程序中出现不同的操作符的数量
n2 程序中出现的不同的操作数的数量
N1 程序中出现的操作符总数
N2 程序中出现的操作数总数
规则2:在基本测量的基础上,分别从系统层、类层和方法层三个层次按表3所示的Halstead复杂度计算公式进行复杂度度量;
表3.Hasltead复杂度计算公式
名称 公式
程序实际长度 N=N1+N2
词汇量 n=n1+n2
容量 V=N*log2(n)
程序难度 D=(n1/2)*(N2/n2)
程序级别 L=1/D
工作量 E=V*D
预测错误数 B=V/3000
实现时间 T=E/18
规则3:应用以上规则进行度量时,分别扫描系统代码,生成语法树,独立度量,度量结果互相校验,其中,系统层的度量结果应与所有类的度量结果之和相一致;各类的度量结果应与类中所有方法的度量结果之和相一致。
进一步的,本发明的方法中,步骤3)中评估待测软件版本的Halstead复杂度度量结果时,方法层Halstead复杂度中容量的阈值设定为1500,类层Halstead复杂度容量的阈值设定为7000。
进一步的,本发明的方法中,步骤5)的具体流程为:
分别获取待评估软件当前版本V_current和历史版本V_last的.java文件的路径;
将两个版本的源码进行对比,确定发生变更的所有文件路径,并存入变更文件路径集合fileSet;
遍历所述变更文件路径集合fileSet中的路径,并分别在V_current版本和V_last版本中去匹配相应的路径;
将两个版本中匹配成功的路径文件分别输入到源码差异分析器ChangeDistiller中进行代码差异分析;
提取分析结果,提取与Halstead复杂变化相关的代码变更类型,将结果输入到格式文件中。
进一步的,本发明的方法中步骤1)和步骤2)先将所导入的Java文件转化为抽象语法树AST,再对语法树进行遍历,统计其中的操作符和操作数,然后通过计算获得其Halstead复杂度。通常,源代码中的操作符是指程序中完成一个动作的代码元素;而操作数则为参与到这个动作的代码元素。根据此定义及Java语言的特点,本发明对Java语言中的操作符和操作数进行了具体的分类,其识别规则如下:
规则1:操作符定义为程序中完成一个动作的代码元素;针对Java语言,操作符是指:
●Java中的关键字;
●软件程序中的声明,包括包的声明、方法声明、类的声明;
●总是一起出现的结构化操作符,如if-else结构、do-while结构等;以及结构化操作符中出现的其它符号,如“:”和“()”也都包括在其中,不再重复计数。
●方法调用;
●运算符。
规则2:操作数是指参与到操作符动作中的代码元素。针对Java语言而言,操作符是指:
●标识符,即所有的用户定义标识符,如常量名、变量名等;
●常量,即程序中出现的各种常量,如字符串常量,字符常量,数字常量等;
规则3:对于以上规则中没有覆盖的符号,如符号“;”、“//”和‘/**/’,我们认为:分号“;”是一个标点符号,表示一行代码的结束;而“//”和‘/**/’是注释相关的符号,它们既不属于操作符也不属于操作数,而且不会对代码的操作造成影响,因此在检测中不予考虑。
规则:4:Java源码转化为AST后,源码中的每种结构都可转为AST中的节点(ASTNode),根据规则1)和2),可将AST节点划分如表1所示。:
优选的,本发明的方法中步骤2)通过统计AST中相应的操作符和操作数结点数目来从各个层面计算软件的Halstaed复杂度。首先,进行表2所示的基本测量。
在这些值的基础上,我们从系统层、类层次以及方法层三个层次对V_current的软件代码Halstead复杂度进行度量,度量公式如表3所示。
由表3可知:
程序长度N,是程序中所有的操作符和操作数的总和。与传统的代码行(LOC)计算相比,Halstead复杂度中的程序长度N对程序进行了更细致的统计。
词汇量n,是程序中的不同操作符数量和不同操作数数量之和。词汇量n说明了完成这段代码共用了多少个不同的符号。
容量V,是指程序所包含的信息量,或程序员要读懂某段程序至少需要理解的信息量。容量V与长度N和词汇量n相关,由公式可以看出,长度N对容量的影响更大,呈线性关系。一个程序的容量过高会对后期维护造成较大的影响。
程序难度D,是指完成代码的难度级别。如果程序中存在大量相同的操作数,其难度D会增大。
程序级别L,反映的是程序最简洁形式的容量与实际容量之比。
工作量E,是指完成这段代码所需投入的总精力,是程序容量和难度的乘积。
预测错误数B,是指这段代码中可能找到的潜在缺陷数目。
实现时间T,是指完成这段代码花费的时间,计算结果的单位为秒。
进一步的,本发明的方法步骤2)对软件Halstead复杂度的评估中对Halstead复杂度的阈值进行了定义。由于在所有的Halstead复杂度度量指标中,程序长度(N)和容量(V)已经得到一些实验的证明,在这些指标中的参考价值最高,在此我们重点关注Halstead的容量(V)的度量。根据软件质量管理工具McCabeIQ(http://www.mccabe.com/.)的规定,方法容量的阈值可设定为1500。
由于没有找到一个大家普遍认可的类层Halstead复杂度阈值规范,本发明进行了类层Halstead复杂度阈值分析实验以获取经验数据:通过对github开源代码库(https://github.com)中排名在前157的基于Java语言的开源项目的分析,我们共得到了132540个类的Halstead容量信息;通过对这些数据进行平均值及标准差的分析,得到类层次的容量阈值取整后为7000。由于这157个开源项目都是被公认为开发和维护比较好的开源项目,藉此可以确定类层圈复杂度阈值的合理性。
进一步的,本发明的方法中步骤3)通过比对相邻版本的度量数据,发现哪些类发生了Halstead复杂度变化。
本发明方法可以通过代码解析和Halstead复杂度度量,从方法层、类层和系统层三个层面评估软件代码的复杂程度;在对软件演化过程中各版本Halstead复杂度的度量和评估的基础上,该方法能够展现演化过程中软件代码的质量变化;该方法还能够通过对不同版本代码的差异分析,确定演化中软件代码Halstead复杂度变化的原因,为后续的演化操作提供参考。在软件演化的过程中,利用上述方法对软件各个演化版本进行代码Halstead复杂度的度量和评估,其评估结果可以展现演化过程中软件代码的质量变化。对于演化过程中复杂度发生了较大变化的版本,可进行相邻版本之间的代码差异分析,确定变更发生的位置,形成分析报告。相关人员可以根据分析报告了解当前版本软件与前一版本相比发生了哪些演化,分析演化过程中软件代码复杂度变化的原因,演化操作对代码复杂度的影响。
本发明解决了软件演化过程中复杂度得不到有效控制的问题,较之其他软件演化度量和评估方法,该方法注重演化过程中软件Halstead复杂度的变化,实现对软件复杂度的控制。
有益效果:本发明与现有技术相比,具有以下优点:
本发明方法通过对Eclipse JDT生成的抽象语法树进行操作数和操作符的分析和统计,从方法层、类层和系统层度量软件代码的Halstead复杂度,主要用于发现软件演化中代码复杂度的变化并对其进行原因分析,与现有技术相比,具有以下优点:
(1)本方法利用Eclipse JDT将待测Java软件转化为抽象语法树,通过对抽象语法树的遍历获得到软件代码的操作数和操作符信息,用以度量软件代码的Halstead复杂度。传统的Halstead复杂度度量通常用于面向过程的程序设计语言,用于面向对象的程序设计语言时,仅有操作数和操作符的简单定义,缺乏实用的划分规则。我们的方法明确定义了Java代码的操作数和操作符识别规则,并根据规则对解析得到的抽象语法树中的节点进行了明确的分类,使得Halstead复杂度度量更加容易进行。
(2)本方法从系统层、类层次以及方法层次三个层面对软件的Halstead复杂度演化进行全面的度量与评估。现有针对Java软件的代码Halstead复杂度度量方法往往仅度量方法的Halstead复杂度,即便有个别方法计算了类的Halstead复杂度或者系统的Halstead复杂度,也没有将其应用在软件演化评估分析当中,仅提供了零散的度量方法。本方法支持对演化过程中软件各个版本的Halstead复杂度度量,支持方法层和类层次软件复杂度的评估比较,并能够支持系统层软件复杂度演化的状态和趋势分析。
(3)本方法能够对软件演化过程Halstead复杂度发生明显变化的版本进行原因分析。现有的代码复杂度度量方法和工具仅提供对代码复杂度的度量,而代码变更分析方法则只提供了对代码整体变更的分析,并不针对复杂度变化,因而得出的变更信息种类繁杂,难以评判。本方法在获取各个软件版本类层次的Halstead复杂度数据的基础上,通过对比分析获取相邻版本中各类的复杂度变化情况,再通过相邻版本软件源码比对检测代码Halstead复杂度发生了变化的类和方法,对其变更类型、变更细节进行详尽分析,从而可以定位出Halstead复杂度演化的原因。
附图说明
图1是基于代码Halstead复杂度度量的软件演化评估模型的技术框架示意图。自上而下表示典型的通过Halstead复杂度度量、评估和原因分析促进软件演化的整个流程。
图2给出了某方法的抽象语法树结构样例,其中用线框标出了需要识别的操作符和操作数节点。
具体实施方式
下面结合实施例和说明书附图对本发明作进一步的说明。图1给出了基于代码Halstead复杂度度量的软件演化评估模型的技术框架。实施例中所使用项目为Java开源软件项目JEditor。
进行单版本Halstead复杂度度量评估的的实施例为JEditor0.2版本;在对JEditor各个版本分别进行了度量的基础上,我们选择了复杂度变化最大的JEditor0.4和JEditor0.4.1进行Halstead复杂度演化评估与分析的实施例。具体实施方式为:
步骤1)使用JDT对Jeditor 0.2的程序源代码进行代码解析,生成抽象语法树。
抽象语法树(Abstract Syntax Tree,AST)作为程序的一种中间表示形式,在代码解析、程序分析等诸多领域有广泛的应用。它将java源代码映射为树的形式,每个java语法结构被表示成AST节点。下面的代码是JEditor0.2版本中org.jeditor.app包下面的SyntaxManager.java文件中的一个方法声明:
图2显示了这段代码所对应的AST树,图中用线框标注了其中的操作符和操作数。从该片段中可以看出操作符结点为:MethodDeclaration和RrturnStatement;操作数结点为Moddifier SimpleName。
步骤2)根据解析后的AST树对Jeditor0.2进行系统层次、类层次和方法层次的Halstead复杂度度量,并根据复杂度阈值对其度量结果进行评估。
系统层度量扫描整个版本的所有文件的AST树,统计其操作符数和操作数数存入系统层Halstead复杂度信息表(SystemHalsteadInfo)。类层次和方法层做相似的操作,对版本中各个类(或方法)的原始数据进行统计并存入相应数据库表。类层Halstead复杂度信息表(ClassHalsteadInfo)中和方法层Halstead复杂度信息(MethodHalsteadInfo)中都对文件的完整路径和相关度量数据进行了记录。
通过度量,Jeditor0.2中唯一操作符数目n1为744,唯一操作数数目n2为2070,操作符总数N1为15617,操作数总数N2为16502。经过计算,其Halstead复杂度信息包括:程序实际长度为32119,程序的容量为255100.73,预测bug数目为85.03,工作量为7.56E8,程序难度为2965.58。
通过类的Halstead复杂度评估发现:jeditor0.2中类总数为550个,其中Halstead复杂度容量值小于7000的有95个,占总类数目的96.9%;容量值大于等于7000的类有3个,占比3.1%。通过评估,可以确定Halstead容量值过高的3个类的详细信息,具体如表5所示::
表5.Jeditor0.2中Halstead容量值过高的类
相似的,我们可以通过方法层的Halstead复杂度评估提取出jeditor0.2中容量值大于1500的所有方法的详细信息,,具体如表6所示:
表6.Jeditor0.2中Halstead容量值过高的方法
从表6中可以看出,Volume最大的方法为markTokenImpl(byte,Segment,int),Volume为5060.74,长度为1010,预测bug数为1.69,数值较高。结合表5可知,该方法所属类的圈复杂度同样很高,应该对其进行关注。
步骤3)从软件代码库中获取Jeditor项目的其它6个版本的源码,分别按照步骤1)和步骤2)进行代码解析和各层次的Halstead复杂度度量。对软件各版本的度量结果进行分析比较,对于系统Halstead复杂度发生较大变化的相邻版本,进行类层次的复杂度比较,定位发生变化的类,然后再进行类中方法的复杂度比较,找出其中质量指标变化之处。
Jeditor项目各版本系统层Halstead复杂度中容量(v)的度量结果如下:
表7 Jeditor各版本的系统层Halstead复杂度容量值
通过表7对Jeditor项目各版本系统层Halstead复杂度中容量(v)的度量结果比较可以看出,系统容量逐渐上升,0.4.2版本过后,趋于平稳,在0.4到0.4.1变化最大。从Jeditor 0.4和0.4.1版本的类层复杂度信息表(ClassHalsteadInfo)中调取两个版本中类信息进行分析和比较,定位发生变化的类;然后从相应版本方法层复杂度信息表(MethodHalsteadInfo)中调取类信息所有度量结果进行分析比较,找出其中质量指标变化之处。
通过对Jeditor0.4版本和0.4.1版本类层次的比对,发现有3个类发生了变化,其中有一个是新增类。由系统分析得:两个变更类是JAppEditor类和FilePane类,0.4.1版的新增类是SettingsDialog,它们都属于org.jeditor.app包。
步骤4)对变化较大的相邻版本的项目源码进行代码差异分析,找出步骤3)所确定位置处两个版本间的代码差异;进行差异原因分析,并将差异的位置、原因等记录下来。
通过对Jeditor 0.4和0.4.1两个版本的项目源码进行去重比对,发现:JAppEditor类中新增3个方法,删除2个方法,同时其中的actionPerformed方法复杂度由2降为1;FilePane类中新增1个方法;0.4.1版本的新增类SettingsDialog中有19个方法。方法名在此不再赘述。
步骤5)将步骤4)的比对结果输出到.csv文件中呈现给用户。
上述实施例仅是本发明的优选实施方式,应当指出:对于本技术领域的普通技术人员来说,在不脱离本发明原理的前提下,还可以做出若干改进和等同替换,这些对本发明权利要求进行改进和等同替换后的技术方案,均落入本发明的保护范围。

Claims (5)

1.一种基于代码Halstead复杂度度量的软件演化评估方法,其特征在于,该方法包括以下步骤:
步骤1)针对待评估软件的当前版本V_current和历史版本V_last,根据源代码分别构造各个版本的抽象语法树;
步骤2)根据所述步骤1)获取的抽象语法树,分别从系统层、类层和方法层三个层次对待测软件版本的代码进行Halstead复杂度度量,所述待测软件版本包括当前待测目标版本V_current和历史版本V_last;
步骤3)从类层和方法层分别评估待测软件版本的Halstead复杂度度量结果,找出软件中Halstead复杂度超过阈值范围的类和方法;
步骤4)对待评估软件的当前版本V_current和历史版本V_last得到的Halstead复杂度度量结果按层次进行分析比较,确定其中Halstead复杂度发生变化的类和方法;
步骤5)对待评估软件的当前版本V_current和历史版本V_last的项目源码进行分析比较,找出两者的代码差异,输出到格式文件中;
步骤6)针对待评估软件当前版本V_current和历史版本V_last,通过所述步骤4)得到的两个版本中Halstead复杂度发生变化的类和方法,以及所述步骤5)得到的两个版本的代码差异,进行代码差异定位,并根据代码差异确定导致度量结果发生变化的原因,形成软件演化评估。
2.根据权利要求1所述的基于代码Halstead复杂度度量的软件演化评估方法,其特征在于,所述步骤1)构造的抽象语法树中包含源码中操作符和操作数的解析信息,所述操作符和操作数的解析信息符合以下规则:
规则1:程序源码转化为抽象语法树后,源码中的每种结构都以抽象语法树节点的形式展现,所述结构包括操作符和操作数;
规则2:操作符为程序中完成一个动作的代码元素,所述操作符包括:
开发语言中的关键字;
软件程序中的声明;其中,面向对象开发语言中包括包的声明、类的声明、方法声明;面向过程开发语言中包括函数声明和过程声明;
总是一起出现的结构化操作符,以及结构化操作符中出现的其它符号;
方法调用或函数调用;
运算符;
规则3:操作数是指参与到操作符动作中的代码元素,所述操作数包括:
标识符,即所有的用户定义标识符;
常量,即程序中出现的各种常量;
规则4:对于以上规则中没有覆盖的符号,分号“;”是一个标点符号,表示一行代码的结束;而“//”和‘/**/’是注释相关的符号,它们既不属于操作符也不属于操作数,而且不会对代码的操作造成影响,因此在检测中不予考虑;
规则5:将以上规则应用于Java语言源码生成的抽象语法树,能够得到如下表所示的针对Java抽象语法树中操作符节点和操作数节点的划分:
表1.操作符和操作数相关的ASTNode表
3.根据权利要求1所述的基于代码Halstead复杂度度量的软件演化评估方法,其特征在于,所述步骤2)中进行Halstead复杂度度量的规则如下:
规则1:分别从系统层、类层和方法层三个层次统计相应抽象语法树中操作符和操作数结点数目,然后进行表2所示的Halstead复杂度基本测量;
表2.Halstead复杂度基本测度表
规则2:在基本测量的基础上,分别从系统层、类层和方法层三个层次按表3所示的Halstead复杂度计算公式进行复杂度度量;
表3.Hasltead复杂度计算公式
名称 公式 程序实际长度 N=N1+N2 词汇量 n=n1+n2 容量 V=N*log2(n) 程序难度 D=(n1/2)*(N2/n2) 程序级别 L=1/D 工作量 E=V*D 预测错误数 B=V/3000 实现时间 T=E/18
规则3:应用以上规则进行度量时,分别扫描系统代码,生成语法树,独立度量,度量结果互相校验,其中,系统层的度量结果应与所有类的度量结果之和相一致;各类的度量结果应与类中所有方法的度量结果之和相一致。
4.根据权利要求1、2或3所述的基于代码Halstead复杂度度量的软件演化评估方法,其特征在于,所述步骤3)中评估待测软件版本的Halstead复杂度度量结果时,方法层Halstead复杂度中容量的阈值设定为1500,类层Halstead复杂度容量的阈值设定为7000。
5.根据权利要求1、2或3所述的基于代码Halstead复杂度度量的软件演化评估方法,其特征在于,所述的步骤5)的具体流程为:
分别获取待评估软件当前版本V_current和历史版本V_last的.java文件的路径;
将两个版本的源码进行对比,确定发生变更的所有文件路径,并存入变更文件路径集合fileSet;
遍历所述变更文件路径集合fileSet中的路径,并分别在V_current版本和V_last版本中去匹配相应的路径;
将两个版本中匹配成功的路径文件分别输入到源码差异分析器ChangeDistiller中进行代码差异分析;
提取分析结果,提取与Halstead复杂变化相关的代码变更类型,将结果输入到csv文件中。
CN201710191917.8A 2017-03-28 2017-03-28 基于Halstead复杂度度量的软件演化评估方法 Withdrawn CN107066384A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201710191917.8A CN107066384A (zh) 2017-03-28 2017-03-28 基于Halstead复杂度度量的软件演化评估方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201710191917.8A CN107066384A (zh) 2017-03-28 2017-03-28 基于Halstead复杂度度量的软件演化评估方法

Publications (1)

Publication Number Publication Date
CN107066384A true CN107066384A (zh) 2017-08-18

Family

ID=59617921

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201710191917.8A Withdrawn CN107066384A (zh) 2017-03-28 2017-03-28 基于Halstead复杂度度量的软件演化评估方法

Country Status (1)

Country Link
CN (1) CN107066384A (zh)

Cited By (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108563555A (zh) * 2018-01-10 2018-09-21 江苏工程职业技术学院 基于四目标优化的故障更改代码预测方法
CN109815148A (zh) * 2019-01-28 2019-05-28 华东师范大学 一种软件复杂度计算系统
CN110955606A (zh) * 2019-12-16 2020-04-03 湘潭大学 一种基于随机森林的c语言源代码静态评分方法
CN111274146A (zh) * 2020-01-20 2020-06-12 北京百度网讯科技有限公司 一种代码度量方法、装置、电子设备和介质
CN111538674A (zh) * 2020-06-08 2020-08-14 中国联合网络通信集团有限公司 分布式软件测试方法、系统、设备及介质
CN111813398A (zh) * 2020-07-20 2020-10-23 云南财经大学 一种空间规划的大数据集成方法
CN111913874A (zh) * 2020-06-22 2020-11-10 西安交通大学 一种基于语法结构变更分析的软件缺陷溯源方法

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105867906A (zh) * 2016-03-22 2016-08-17 东南大学 一种面向软件演化的代码可替换性评估方法
CN105893257A (zh) * 2016-03-30 2016-08-24 东南大学 一种基于演化的软件架构评估方法
CN106406870A (zh) * 2016-09-06 2017-02-15 北京航空航天大学 一种基于软件复杂网络的四维软件演化度量分析方法

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN105867906A (zh) * 2016-03-22 2016-08-17 东南大学 一种面向软件演化的代码可替换性评估方法
CN105893257A (zh) * 2016-03-30 2016-08-24 东南大学 一种基于演化的软件架构评估方法
CN106406870A (zh) * 2016-09-06 2017-02-15 北京航空航天大学 一种基于软件复杂网络的四维软件演化度量分析方法

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
何磊: "基于代码复杂度的软件演化评估与分析", 《中国优秀硕士论文全文数据库》 *

Cited By (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108563555A (zh) * 2018-01-10 2018-09-21 江苏工程职业技术学院 基于四目标优化的故障更改代码预测方法
CN109815148A (zh) * 2019-01-28 2019-05-28 华东师范大学 一种软件复杂度计算系统
CN110955606A (zh) * 2019-12-16 2020-04-03 湘潭大学 一种基于随机森林的c语言源代码静态评分方法
CN111274146A (zh) * 2020-01-20 2020-06-12 北京百度网讯科技有限公司 一种代码度量方法、装置、电子设备和介质
CN111538674A (zh) * 2020-06-08 2020-08-14 中国联合网络通信集团有限公司 分布式软件测试方法、系统、设备及介质
CN111913874A (zh) * 2020-06-22 2020-11-10 西安交通大学 一种基于语法结构变更分析的软件缺陷溯源方法
CN111913874B (zh) * 2020-06-22 2021-12-28 西安交通大学 一种基于语法结构变更分析的软件缺陷溯源方法
CN111813398A (zh) * 2020-07-20 2020-10-23 云南财经大学 一种空间规划的大数据集成方法

Similar Documents

Publication Publication Date Title
CN107066384A (zh) 基于Halstead复杂度度量的软件演化评估方法
Rajpal et al. Not all bytes are equal: Neural byte sieve for fuzzing
Zhou et al. Devign: Effective vulnerability identification by learning comprehensive program semantics via graph neural networks
Li et al. Vuldeepecker: A deep learning-based system for vulnerability detection
Li et al. Improving bug detection via context-based code representation learning and attention-based neural networks
Mansoor et al. Multi-objective code-smells detection using good and bad design examples
Nguyen et al. Recurring bug fixes in object-oriented programs
Ouni et al. Search-based refactoring using recorded code changes
Ouni et al. The use of development history in software refactoring using a multi-objective evolutionary algorithm
CN107239396A (zh) 一种基于代码圈复杂度度量的软件演化评估方法
US20080320457A1 (en) Intermediate Code Metrics
Feng et al. Efficient vulnerability detection based on abstract syntax tree and deep learning
Bafandeh Mayvan et al. Bad smell detection using quality metrics and refactoring opportunities
Lu et al. Nonconformity resolving recommendations for product line configuration
Antal et al. Static javascript call graphs: A comparative study
Oliveira et al. Mapping the effectiveness of automated test suite generation techniques
CN108509338A (zh) 一种基于多层次变更分析的软件演化评估系统及方法
de Oliveira Neto et al. Full modification coverage through automatic similarity-based test case selection
Fraser et al. Behaviourally adequate software testing
CN109783638A (zh) 一种基于半监督学习的用户评论聚类方法
Aman et al. A doc2vec-based assessment of comments and its application to change-prone method analysis
Rahman et al. Clone detection on large scala codebases
Segura et al. Automated generation of computationally hard feature models using evolutionary algorithms
CN113158194B (zh) 一种基于多关系图网络的漏洞模型的构建方法及检测方法
CN112380123A (zh) 一种面向c/c++混源软件的自动化质量评估系统设计方法

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
WW01 Invention patent application withdrawn after publication
WW01 Invention patent application withdrawn after publication

Application publication date: 20170818