CN111290777B - 一种面向软件代码单元和代码度量的代码变更序列方法 - Google Patents
一种面向软件代码单元和代码度量的代码变更序列方法 Download PDFInfo
- Publication number
- CN111290777B CN111290777B CN202010077082.5A CN202010077082A CN111290777B CN 111290777 B CN111290777 B CN 111290777B CN 202010077082 A CN202010077082 A CN 202010077082A CN 111290777 B CN111290777 B CN 111290777B
- Authority
- CN
- China
- Prior art keywords
- code
- submission
- unit
- software
- range
- 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
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/71—Version control; Configuration management
Landscapes
- Engineering & Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Security & Cryptography (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本发明属于软件工程技术领域,具体为一种面向软件代码单元和代码度量的演化历史切片方法。本发明利用代码版本库中的分支和代码提交等代码演化历史信息,通过建立贯穿演化历史的代码持续追溯机制,实现针对指定代码单元或其度量值的演化历史切片分析。所得到的演化历史切片由修改了指定的代码单元或导致指定的代码度量值发生变化的代码变更序列组成,每个代码变更包括从对应的代码提交中抽取的相关信息,包括代码提交唯一编号、提交者、代码修改内容、提交说明等。这种演化历史切片可以帮助理解并追踪代码的演化过程以及相关代码问题的发展变化过程,支持开发人员绩效评价、软件项目质量监控和预警等应用。
Description
技术领域
本发明属于软件工程技术领域,具体涉及一种面向软件代码单元和代码度量的演化历史切片方法。
背景技术
软件开发及质量管理人员经常需要理解并追踪软件代码单元(如方法、语句)的修改历史或者相关代码问题(如圈复杂度高)的发展变化过程。为此,需要建立贯穿演化历史的代码持续追溯机制,针对指定代码单元或其度量值抽取相关的代码变更序列。所得到的代码变更序列可以称为演化历史切片,其中由修改了指定的代码单元或导致指定的代码度量值发生变化的代码变更序列组成,每个代码变更包括从对应的代码提交中抽取的相关信息,包括代码提交唯一编号、提交者、代码修改内容、提交说明信息等。基于这种演化历史切片可以对相关演化历史进行重演,或者持续跟踪代码单元的演化过程。
发明内容
本发明的目的是提供一种面向软件代码单元和代码度量的演化历史切片方法,以实现针对指定代码单元(如方法、语句)或其度量值(如方法的代码长度或圈复杂度)的演化历史切片分析,从而帮助开发人员理解代码的演化过程以及相关代码问题(如圈复杂度高)的发展变化过程,同时追踪代码单元的变化过程,支持开发人员绩效评价、软件项目质量监控和预警等应用。
本发明利用代码版本库中的分支(Branch)和代码提交(Commit)等代码演化历史信息,通过建立贯穿演化历史的代码持续追溯机制,实现针对指定代码单元(如方法、语句)或其度量值(如方法的代码长度或圈复杂度)的演化历史切片分析。本发明所得到的演化历史切片由修改了指定的代码单元或导致指定的代码度量值发生变化的代码变更序列组成,每个代码变更包括从对应的代码提交中抽取的相关信息,包括代码提交唯一编号、提交者、代码修改内容、提交说明信息等。这种演化历史切片可以帮助理解并追踪代码的演化过程以及相关代码问题(如圈复杂度高)的发展变化过程,支持开发人员绩效评价、软件项目质量监控和预警等应用。
本发明提供的面向软件代码单元和代码度量的演化历史切片方法,采用附图1所描述的概念模型描述软件代码单元及其修改关系。软件代码中的文件、方法、语句等均为代码单元,通过程序分析技术从代码中提取并存储;在给定版本的软件代码中,每个代码单元都被唯一标识,具有当前内容和当前行号属性;代码单元的唯一标识在代码修改历史中用于追踪同一个代码单元;当代码单元在某次代码提交中发生变化时,通过对代码修改前后版本的差异分析,根据该代码单元上下文变化和代码单元本身的变化,该代码单元将被识别为同一代码单元的修改、或被识别为原代码单元的删除和一个新增的代码单元;代码单元在某次代码提交中所发生的变化,通过语句位置标明;代码单元发生变化的形式,由变更操作表示,分为新增、删除、修改三种类型,分别通过目标属性表明是对哪个代码单元进行变化。
本发明提供的面向软件代码单元和代码度量的演化历史切片方法,具体步骤如下:
(1)对代码历史切片起点版本v中的所有代码单元,给定唯一标识。
本步骤中,对于每个代码单元,均表示为一个四元组S(id, startLine, endLine,parentElementId),其中id为代码单元(包括语句、方法、文件)的全局唯一标识,startLine和endLine为代码单元的起止行号,parentElementId为直接包含该代码单元的上层代码单元的唯一标识;通过parentElementId级联查询可获取该代码单元的具体位置(如在哪个文件中)。
在此步骤中,代码单元的表示方法遵循附图1的概念模型。
(2)对给定版本v的给定代码单元集合E或给定代码单元的软件度量集M,获取所给定代码单元所在文件及其起止行号,即代码范围Rc,其中c是得到版本v的代码提交。
(3)分析代码提交c前的代码修改,得到代码范围Rc中所有行号在代码提交c之前的行号范围Ro。
本步骤中,先通过版本管理机制获取代码提交c所涉及的文件集F,然后判定步骤(2)中确定的Rc范围是否在文件集F的任意一个文件中;若是,则分析所在文件在提交前后代码差异实现代码行映射,获取Ro;Rc和Ro的行号通过代码版本管理机制获取。若否,则取下一个代码提交c’,回到步骤(2)。
本发明中,通过语句级差异比较为Ro中的代码单元确定唯一标识,映射成功的代码单元具有与Rc中对应代码单元的唯一标识,即实现映射;未能建立映射的代码单元,则分配新的代码单元唯一标识。
(4)通过代码差异分析技术,分析代码提交c前后代码范围Ro和Rc内的代码对应关系,建立前后行号范围内所有代码单元的对应。若Ro与Rc范围内代码存在差异或代码提交前软件度量M的度量值与代码提交后的度量值不同,则将代码提交c的基本信息加入演化历史切片结果;其中,基本信息包括代码提交唯一编号、提交者、代码修改内容、提交说明信息。
本步骤中,采用以下规则判定Ro与Rc范围内的代码是否在度量M上存在度量值差异:若Ro和Rc范围内代码无差异,则度量M上的度量值无差异;否则,对Ro和Rc范围内的代码快照测量度量M的取值,若取值相同则认为不存在差异,否则,认为存在差异。
本步骤中,通过代码差异分析,Ro中能与Rc中的语句建立其对应关系的语句自动获得Rc中对应语句唯一标识。Rc中无法对应到前一个版本的语句Sc,若根据其上下文中相邻的最多4个语句(前后各2个,若不足2个则取实际前后相邻代码)与提交前的4个语句有顺序对应关系,且提交前的4个代码单元之间嵌入了无对应关系的语句So,则该语句Sc与提交前的语句So建立起对应关系,并将So设置为与Sc相同的唯一标识。除此之外,Ro中无法建立对应关系的代码单元将分配一个新的唯一标识。方法的对应关系通过比较修改前后两个版本中方法的签名与所在的文件是否相同来建立。文件的对应关系通过比较文件所在的项目的相对路径来建立。
(5)从代码提交c开始取涉及到代码范围Ro修改的前一次代码提交c’,将代码提交c之前的版本(即代码提交c’之后的版本)作为给定版本,重复步骤(2)-(5),直到取完所有的演化历史提交或者到达给定的分析时间起点。
在此步骤中,对指定时间范围内的每个提交做相应的检测,不允许越过某个提交不予检测。
(6)输出演化历史切片结果,该结果包含所有涉及给定代码单元集合E修改或使软件度量集M度量值发生变化的提交。
本发明技术方案与现有技术相比,具有以下的优点和积极效果:本发明方法能实现不同代码单元的演化历史切片和以软件度量为切片标准的代码演化历史切片。
附图说明
图1为本发明所采用的代码演化历史切片概念模型。其中,文件、类、属性、方法、语句都是代码单元,具有唯一标识;每个代码单元的修改都由代码版本库中的提交记录。
图2为本发明代码演化历史切片方法的总体流程示意图。其中,上半部分是对代码单元,下半部分是对代码度量。
图3为示例的实施过程示意图。其中,示例了一个方法中指定的if语句在提交3044ac的修改前后的演化历史切片过程(仅以一个代码提交为例)。
具体实施方式
下面通实施例并结合附图,进一步描述本发明,理解本发明的目的、具体操作方法和优点。
图2展示了编号为3044ac的代码提交后(左侧代码)和提交前(右侧代码)。对于给定待实施演化历史切片的代码单元(1),通过Git版本修改分析得知,3044ac涉及了目标代码单元所在的文件,因此对相应文件的修改进行差异分析。在代码差异分析中,目标代码范围前3条语句和后3条语句分别实现了匹配,因此提交前代码单元第7、8行语句与待切片的代码单元1实现匹配。进而分析匹配语句的差异,发现待切片代码单元1的if语句是通过3044ac提交新增的,是属于该代码单元的变化,因此将该提交3044ac以及相应的语句变化添加入切片结果。如此向前追溯更早的提交,并将针对第7、8行语句的修改进行分析,从而获取更早的修改,直至分析时段起点,或语句不再存在。由此得到的切片分析结果,就包含了所有设计目标代码修改的提交,以及相应的修改内容。
Claims (7)
1.一种面向软件代码单元和代码度量的代码变更序列方法,其特征在于,对于给定的软件代码单元或度量,在代码版本库中自动分析相关的代码修改,输出代码修改历史中造成给定代码单元内容或度量值变化的相关提交,具体步骤如下:
(1)对代码变更序列起点版本v中的所有代码单元,给定唯一标识;
(2)对给定版本v的给定代码单元集合E或给定代码单元的软件度量集M,获取所给定代码单元所在文件及其起止行号,即代码范围Rc,其中c是给定版本v的代码提交;
(3)分析代码提交c前的代码修改,得到代码范围Rc中所有行号在代码提交c之前的行号范围Ro;
(4)通过代码差异分析技术,分析代码提交c前后代码范围Ro和行号范围Rc内的代码对应关系,建立前后行号范围内所有代码单元的对应;若Ro与Rc范围内代码存在差异或代码提交前软件度量集M的度量值与代码提交后的度量值不同,则将代码提交c的基本信息加入代码变更序列结果;其中,基本信息包括代码提交唯一编号、提交者、代码修改内容、提交说明信息;
(5)从代码提交c开始取相邻前一次代码提交c’,作为给定版本,重复步骤(2)-(5),直到取完所有的演化历史提交或者到达给定的分析时间起点;
(6)输出代码变更序列结果,该结果包含所有涉及给定代码单元集合E修改或使软件度量集M度量值发生变化的提交。
2. 根据权利要求1所述的方法,其特征在于,步骤(1)中,代码中所有语句均给定一个唯一标识,并通过代码提交历史中的代码修改信息建立前后版本的追踪关系;每个代码单元表示为一个四元组S(id, startLine, endLine, parentElementId);其中,id为代码单元的全局唯一标识, startLine和endLine为代码单元的起止行号,parentElementId为该代码单元直接隶属的上层代码单元的唯一标识;通过parentElementId级联查询可获取该段代码所在的文件;这里,代码单元包括语句、方法、文件。
3.根据权利要求1所述的方法,其特征在于,步骤(3)中,先获取代码提交c所涉及的文件集F,然后判定步骤(2)中确定的Rc范围是否在文件集F的任意一个文件中;若是,则分析所在文件在提交前后代码差异实现代码行映射,获取Ro;若否,则说明c并未修改待切片的代码,取下一个代码提交c’,回到步骤(2)。
4.根据权利要求3中所述的方法,其特征在于,通过语句级差异比较为Ro中的代码单元确定唯一标识,映射成功的代码单元具有与Rc中对应代码单元的唯一标识,即实现映射;未能建立映射的代码单元,则分配新的代码单元唯一标识。
5.根据权利要求1所述的方法,其特征在于,步骤(4)中,采用以下规则判定Ro与Rc范围内的代码是否存在差异:若Ro与Rc范围内的代码单元唯一标识及其出现的顺序完全相同,则不存在差异;否则,认为存在差异。
6.根据权利要求1所述的方法,其特征在于,步骤(4)中,采用以下规则判定Ro与Rc范围内的代码是否在软件度量集M上存在度量值差异:若Ro和Rc范围内代码无差异,则软件度量集M上的度量值无差异;否则,对Ro和Rc范围内的代码快照测量软件度量集M的取值,若取值相同则认为不存在差异,否则,认为存在差异。
7.根据权利要求1所述的方法,其特征在于,步骤(5)中应对指定时间范围内的每个提交做相应的检测。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010077082.5A CN111290777B (zh) | 2020-01-23 | 2020-01-23 | 一种面向软件代码单元和代码度量的代码变更序列方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202010077082.5A CN111290777B (zh) | 2020-01-23 | 2020-01-23 | 一种面向软件代码单元和代码度量的代码变更序列方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111290777A CN111290777A (zh) | 2020-06-16 |
CN111290777B true CN111290777B (zh) | 2021-09-17 |
Family
ID=71020684
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202010077082.5A Active CN111290777B (zh) | 2020-01-23 | 2020-01-23 | 一种面向软件代码单元和代码度量的代码变更序列方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN111290777B (zh) |
Families Citing this family (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN112698866B (zh) * | 2021-01-06 | 2022-06-17 | 中国科学院软件研究所 | 一种基于Git的代码行生命周期追溯方法及电子装置 |
Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103235729A (zh) * | 2013-04-18 | 2013-08-07 | 南京大学 | 一种基于代码变更的软件模型同步方法 |
CN106933572A (zh) * | 2017-02-20 | 2017-07-07 | 南京邮电大学 | 一种基于llvm中间表示程序切片的度量模型 |
CN108614778A (zh) * | 2018-05-10 | 2018-10-02 | 天津大学 | 基于高斯过程回归的安卓App程序演化变更预测方法 |
CN108804326A (zh) * | 2018-06-12 | 2018-11-13 | 上海新炬网络技术有限公司 | 一种软件代码自动检测方法 |
CN109857648A (zh) * | 2019-01-14 | 2019-06-07 | 复旦大学 | 一种api误用的变更模式挖掘方法 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
Family Cites Families (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JP4676331B2 (ja) * | 2003-02-04 | 2011-04-27 | パナソニック株式会社 | コード変換方法及びその装置 |
US8225302B2 (en) * | 2003-02-13 | 2012-07-17 | Lawrence Taylor Waugh | System and method for managing source code and acquiring metrics in software development |
US8146059B2 (en) * | 2007-12-12 | 2012-03-27 | International Business Machines Corporation | Feeding test metrics into an integrated development environment to aid software developers to improve code quality |
CN103176803A (zh) * | 2013-04-18 | 2013-06-26 | 成都一云数据处理有限公司 | 一种代码序列化的方法 |
CN108108168B (zh) * | 2017-12-18 | 2021-02-02 | 中山大学 | 结合代码演化信息构造代码坏味训练数据集的方法 |
-
2020
- 2020-01-23 CN CN202010077082.5A patent/CN111290777B/zh active Active
Patent Citations (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103235729A (zh) * | 2013-04-18 | 2013-08-07 | 南京大学 | 一种基于代码变更的软件模型同步方法 |
CN106933572A (zh) * | 2017-02-20 | 2017-07-07 | 南京邮电大学 | 一种基于llvm中间表示程序切片的度量模型 |
CN108614778A (zh) * | 2018-05-10 | 2018-10-02 | 天津大学 | 基于高斯过程回归的安卓App程序演化变更预测方法 |
CN108804326A (zh) * | 2018-06-12 | 2018-11-13 | 上海新炬网络技术有限公司 | 一种软件代码自动检测方法 |
CN109857648A (zh) * | 2019-01-14 | 2019-06-07 | 复旦大学 | 一种api误用的变更模式挖掘方法 |
CN110532019A (zh) * | 2019-06-27 | 2019-12-03 | 北京大学 | 一种软件代码片段历史追溯的方法 |
Non-Patent Citations (4)
Title |
---|
A Framework for Source Code metrics;Neli Maneva;《International Conference on Computer Systems and Technologies - CompSysTech"10》;20081203;全文 * |
Understanding evolutionary coupling by fine-grained co-change relationship analysis;Daihong Zhou;《ICPC "19: Proceedings of the 27th International Conference on Program ComprehensionMay 2019》;20190525;全文 * |
代码静态分析--试用SpecChecker;WowMannix;《https://blog.csdn.net/eigrl/article/details/81208131》;20181007;全文 * |
基于代码大数据的软件开发质量追溯体系;彭鑫;《DevOps国际峰会2019·北京站》;20190706;全文 * |
Also Published As
Publication number | Publication date |
---|---|
CN111290777A (zh) | 2020-06-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN108089893B (zh) | 冗余资源的确定方法、装置、终端设备与存储介质 | |
Pham et al. | Complete and accurate clone detection in graph-based models | |
CN108153784B (zh) | 同步数据处理方法和装置 | |
CN109359094B (zh) | 一种分布式系统日志全链路追踪方法及装置 | |
CN107608732B (zh) | 一种基于bug知识图谱的bug搜索定位方法 | |
US10802822B2 (en) | System and method for reproducible machine learning | |
CN107016018B (zh) | 数据库索引创建方法及装置 | |
WO2019019647A1 (zh) | 应用程序测试范围确定方法、系统、服务器和存储介质 | |
CN110442847B (zh) | 基于代码仓库过程管理的代码相似性检测方法及装置 | |
CN111563041A (zh) | 一种测试用例按需精准执行方法 | |
CN111026433A (zh) | 基于代码变更历史的软件代码质量问题自动修复方法、系统及介质 | |
CN114324368B (zh) | 基于机械视觉检测的改性塑料生产检测方法及系统 | |
CN111290777B (zh) | 一种面向软件代码单元和代码度量的代码变更序列方法 | |
Wu et al. | Ossfp: Precise and scalable c/c++ third-party library detection using fingerprinting functions | |
CN112256637A (zh) | 一种基于抽象语法树的文件管理方法、装置及存储介质 | |
Shafiq et al. | Application of signature-based matching for IFC model comparison | |
CN115774707B (zh) | 基于对象属性数据处理方法和装置、电子设备和存储介质 | |
CN113704246A (zh) | 一种基于虚拟索引的数据库索引优化方法和系统 | |
Kauhanen et al. | Regression test selection tool for python in continuous integration process | |
CN114637510A (zh) | 代码分析的方法和相关设备 | |
Agrawal et al. | Ruffle: Extracting co-change information from software project repositories | |
CN111722998A (zh) | 代码的质量控制方法、系统、设备及存储介质 | |
CN114880673A (zh) | 针对小程序源代码进行隐私数据泄露检测的方法及系统 | |
Kumar et al. | Code clone detection and analysis using software metrics and neural network-a literature review | |
Imazato et al. | Finding extract method refactoring opportunities by analyzing development history |
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 |