CN104820587B - 细粒度的基于频繁项集挖掘产生api替换规则的方法 - Google Patents
细粒度的基于频繁项集挖掘产生api替换规则的方法 Download PDFInfo
- Publication number
- CN104820587B CN104820587B CN201510173809.9A CN201510173809A CN104820587B CN 104820587 B CN104820587 B CN 104820587B CN 201510173809 A CN201510173809 A CN 201510173809A CN 104820587 B CN104820587 B CN 104820587B
- Authority
- CN
- China
- Prior art keywords
- api
- substitution rules
- code
- frequent item
- item
- 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
Landscapes
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
Abstract
本发明公开了一种细粒度的基于频繁项集挖掘产生API替换规则的方法,该方法通过新旧版本的API在类库内部被调用的变化情况,利用频繁项集挖掘算法推导出新旧版本API在使用中的替换规则。从每个匹配的方法对中提取事务时,利用LCS算法比较该匹配方法对的源码,利用相同代码行数大于指定阈值的Range作为分割点,产生若干个匹配的代码片段对,然后由每对代码片段的调用关系的变化产生事务。与现有的以方法为单位产生调用关系变化的方案相比,本发明在一定程度上保留了调用方法的上下文信息,提高了事务的准确度。本发明通过在产生的事务集合上应用频繁项集挖掘算法产生频繁项集,然后从中产生关联规则,可以产生更加多样化的API替换规则。
Description
技术领域
本发明涉及到在使用类库的应用程序迁移到新版本时,应用程序应该如何适应新版API的使用,具体是一种细粒度的基于频繁项集挖掘产生API替换规则的方法,属于计算机软件开发技术领域。
背景技术
软件开发过程中经常需要使用第三方的类库,而在类库的演化过程中不可避免的会修改它们提供的API,从而导致应用程序无法编译或产生错误的运行结果,软件开发人员必须花费大量的时间修改应用程序使其正确使用新版本的API。
现有的技术中,CatchUp!等工具要求类库的开发人员记录类库演化过程中的重构操作或者手动书写转化规则,通过增加类库开发人员的额外时间开销降低类库使用人员在类库升级时花费的代价;SemDiff等工具则利用类库内部调用关系的变化自动推导出替换规则,比如方法A在旧版本中调用了方法B,而在新版本中方法A调用了方法C,则可以认为方法C可能替换了方法B;还有一类工具混合了若干个其他方法以克服单个方法带来的局限性,如AURA结合了调用依赖分析和文本相似度分析,在一定程度上提高了生成的API替换规则的准确性。
现有的技术往往存在如下的问题:需要类库开发人员的参与,加大类库的开发成本;以方法为单位产生调用关系的变化,容易产生假阳性(False Positive),因为调用的替换关系往往发生在程序的局部代码段;产生的替换规则比较单一。
发明内容
发明目的:本发明所要解决的技术问题是在Library不断演化导致其提供的APIs发生变化的情况下,提供一种半自动化的产生API使用变化规则的方法,发明的目的在于克服现有技术的缺陷,产生多样化的替换规则,减少了开发人员将应用程序迁移到新版本Library上时所需的工作量。
技术方案:一种细粒度的基于频繁项集挖掘产生API替换规则的方法,它包含以下步骤:
1)首先从Library的新旧版本version1和version2中提取出事务数据集。这里事务的概念与频繁项集挖掘中事务的概念相似,我们使用事务刻画了一个代码片段s在version1和version2中调用关系的变化。每个事务可以包含两种类型的项:Added和Removed类型,其中Added类型的项表示该代码片段在新版本中相对于旧版本添加的方法调用,而Removed类型的项表示该代码片段在新版本中相对于旧版本移除的方法调用。与已有的以方法为单位分析调用关系变化的技术相比,该技术从一个方法对中可以产生若干个细粒度的事务,精确度较高;
2)指定最小支持度(根据经验一般设为3),利用闭频繁项集挖掘算法在1)中提取的事务数据集上进行挖掘,产生闭频繁项集;指定最小置信度(根据经验一般设为0.8),然后从闭频繁项集中产生关联规则,与已有工作相比,能支持生成一对一,一对多,多对一,多对多的替换规则;
3)检测应用程序中使用旧API的调用,并在IDE中自动显示为高亮;并在IDE中列出相应的替换规则供开发人员参考。开发人员可以应用相应的替换规则半自动地更新应用程序的代码。
步骤1)中从version1和version2中提取出事务数据集的具体步骤包括:
11)解析version1和version2的源码,匹配在两个版本中定义的方法;
12)分析每个匹配的方法对的源码,将其分割成若干个匹配的代码片段对;
13)对每个匹配的代码片段对,分析其调用关系的变化情况,产生Added和Removed类型的项,组成一个事务。
步骤11)中对version1和version2版本的方法进行匹配的步骤如下:
111)分别为version1和version2的源码创建抽象语法树,提取每个版本中所有方法的申明信息,包括返回值类型、方法名和参数类型;
112)计算version1中的每个方法和version2中的每个方法的相似度,若相似度大于设定的阈值,则将该方法对和相似度放入集合L中;
113)将集合L中的每个方法对按相似度由高到低排序;
114)将L中顶端的一个方法对作为匹配方法对,删除L中具有该方法对中某个方法的所有方法对;
115)执行114)步骤,直到L集合为空。
步骤112)中两个方法的相似度是根据返回值类型、方法名以及参数类型列表的相似度加权求和得到的,各自的相似度利用token-level LCS计算得到。
步骤12)中对每个匹配的方法对进行划分的具体步骤是:
121)利用LCS(Longest Common Sequence,最长公共子序列)算法比较匹配方法对的源码,得到一系列的形如Range{Left:(2,5)Right:(3,5)}的信息。Range表示这个匹配方法对中属于version1的方法从第2行开始和属于version2的方法从第3行开始有5行代码完全相同。只返回相同代码行数大于指定阈值的Range。
122)使用121)返回的Range中的Left和Right信息对匹配方法对的源码进行分割,得到若干个匹配的代码片段对。
步骤13)中利用Parser对每个匹配的代码片段对进行解析,分别提取它们调用的方法的信息。记version1中的代码片段调用的方法集合为L,version2中相应的代码片段调用的方法集合为R。将L-R中的方法调用标记为Removed类型的项,把R-L中的方法调用标记为Added类型的项,组成一个事务。
步骤2)中从闭频繁项集中产生API替换规则的具体步骤如下:所有的Removed类型项为规则的先导,所有Added类型项为规则的后继,若缺少任意一种类型的项,则该项集被丢弃。最后通过最小置信度对关联规则进行过滤。
本发明与现有技术相比具有如下优点:
1)本发明产生更加细粒度的事务数据集。在从每个匹配的方法对中提取事务时,本发明利用LCS(Longest Common Sequence,最长公共子序列)算法比较该匹配方法对的源码,利用相同代码行数大于指定阈值的Range作为分割点,产生若干个匹配的代码片段对,然后由每对代码片段的调用关系的变化产生事务。与现有的以方法为单位产生调用关系变化的方法相比,本发明在一定程度上保留了调用方法的上下文信息,减少了以方法为单位的方法带来的不精确问题和假阳性(False Positive)问题。
2)本发明产生的API替换规则更加多样化。与现有技术相比,本发明先利用频繁项集挖掘算法对生成的数据集进行挖掘,生成频繁项集,进一步由频繁项集生成关联规则的方案可以比较准确地产生一对多、多对一以及多对多的多样化替换规则,而不仅仅是一对一的替换规则。
附图说明
图1为本发明实施例中从新旧版本中提取事务数据集的主要流程图;
图2为本发明实施例中利用闭频繁项集产生API替换规则的主要流程图。
具体实施方式
下面结合具体实施例,进一步阐明本发明,应理解这些实施例仅用于说明本发明而不用于限制本发明的范围,在阅读了本发明之后,本领域技术人员对本发明的各种等价形式的修改均落于本申请所附权利要求所限定的范围。
第一步,分别提取新旧版本中定义的所有方法的签名和调用的其他方法,还需要记录它们所在的文件名和出现在文件中的位置和长度。具体步骤如下:对类库源码中的每个文件使用了Eclipse的JDT插件提供的Parser进行解析,生成抽象语法树(AST)。然后遍历该AST,记录每个定义的方法(包括构造函数)的完全限定名和在文件中的位置以及长度等信息,另外还要保存该方法中调用的其他方法(包括字段的使用)的完全限定名和在文件中的位置信息,保存在一个Map中,其中Key为一个定义的方法信息,Value是一个列表,保存每个被调用方法的信息。
第二步,对在类库的新旧版本都定义的方法,产生若干个细粒度的事务。具体步骤如下:对每个方法对,从相应的文件获得方法的代码,利用LCS算法比较两者的代码文本(这里用了Eclipse中的Compare插件),把源码中相同行数大于一个阈值的部分作为分割点,把一个方法对划分成若干个代码片段对,记录每个代码片段在文件中的起始位置和结束位置;然后把每个方法调用的其他方法根据在文件中的位置信息对应到不同的代码片段对,这样每对代码片段对可以得到一个被调用方法集合对<oldCallees,newCallees>:其中oldCallees为旧版本代码片段中调用的方法集合,newCallees为新版本代码片段中调用的方法集合。从这个调用方法集合对中可以产生一个事务:只存在oldCallees集合中的每个方法产生一个Removed类型的项,只存在于newCallees集合中的每个方法产生一个Added类型的项。对所有的方法对执行过步骤二后,我们就可以得到一个事务数据集。
第三步,使用CLOSET+算法对步骤二中得到的事务数据集进行闭频繁项集挖掘,然后从闭频繁项集产生关联规则。在进行闭频繁项集挖掘时需要设定最小支持度(例如在初步实现中设置为2)。按如下步骤从闭频繁项集产生关联规则:将所有的Removed类型项为规则的先导,所有Added类型项为规则的后继,若有一种类型的项的数目为0则忽略掉该频繁闭项集。最后遍历事务数据集,计算产生的规则的置信度,若大于指定的最小置信度阈值(例如在初步实现中设置为0.8)则保留该规则。
第四步,对于需要迁移到新版本类库的应用程序中的每个Java文件,使用JDT插件提供的Parser进行解析,生成抽象语法树(AST)。遍历AST检测应用程序中所有对旧版本API的使用,记录下所有需要修改API调用的位置。在Eclipse中打开相应的源文件后,在TextEditor中对这些调用进行高亮。点击其中某个方法后,在Eclipse的一个View中列出所有的备选替换规则供开发人员参考,开发人员可以选择相应的替换规则更新应用程序。
Claims (7)
1.一种细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,包含以下步骤:
1)首先从Library的新旧版本version1和version2中提取出事务数据集;
2)指定最小支持度,利用闭频繁项集挖掘算法在1)中提取的事务数据集上进行挖掘,产生闭频繁项集;指定最小置信度,然后从闭频繁项集中产生关联规则;
3)检测应用程序中使用旧API的调用,并在IDE中自动显示为高亮;并在IDE中列出相应的替换规则供开发人员参考;
步骤2)中使用事务刻画了一个代码片段s在version1和version2中调用关系的变化;每个事务可以包含两种类型的项:Added和Removed类型,其中Added类型的项表示该代码片段在新版本中相对于旧版本添加的方法调用,而Removed类型的项表示该代码片段在新版本中相对于旧版本移除的方法调用;
步骤1)中从version1和version2中提取出事务数据集的具体步骤包括:
11)解析version1和version2的源码,匹配在两个版本中定义的方法;
12)分析每个匹配的方法对的源码,将其分割成若干个匹配的代码片段对;
13)对每个匹配的代码片段对,分析其调用关系的变化情况,产生Added和Removed类型的项,组成一个事务。
2.如权利要求1所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,开发人员应用相应的替换规则半自动地更新应用程序的代码。
3.如权利要求1所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,步骤11)中对version1和version2版本的方法进行匹配的步骤如下:
111)分别为version1和version2的源码创建抽象语法树,提取每个版本中所有方法的声明信息,包括返回值类型、方法名和参数类型;
112)计算version1中的每个方法和version2中的每个方法的相似度,若相似度大于设定的阈值,则将该方法对和相似度放入集合L中;
113)将集合L中的每个方法对按相似度由高到低排序;
114)将L中顶端的一个方法对作为匹配方法对,删除L中具有该方法对中某个方法的所有方法对;
115)执行114)步骤,直到L集合为空。
4.如权利要求3所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,步骤112)中两个方法的相似度是根据返回值类型、方法名以及参数类型列表的相似度加权求和得到的,各自的相似度利用token-level LCS计算得到。
5.如权利要求1所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,步骤12)中对每个匹配的方法对进行划分的具体步骤是:
121)利用LCS(Longest Common Sequence,最长公共子序列)算法比较匹配方法对的源码,得到一系列的形如Range{Left:(2,5)Right:(3,5)}的信息;Range表示这个匹配方法对中属于version1的方法从第2行开始和属于version2的方法从第3行开始有5行代码完全相同;只返回相同代码行数大于指定阈值的Range;
122)使用121)返回的Range中的Left和Right信息对匹配方法对的源码进行分割,得到若干个匹配的代码片段。
6.如权利要求1所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,步骤13)中利用Parser对每个匹配的代码片段对进行解析,分别提取它们调用的方法的信息;记version1中的代码片段调用的方法集合为L,version2中相应的代码片段调用的方法集合为R;将L-R中的方法调用标记为Removed类型的项,把R-L中的方法调用标记为Added类型的项,组成一个事务。
7.如权利要求1所述的细粒度的基于频繁项集挖掘产生API替换规则的方法,其特征在于,步骤2)中从闭频繁项集中产生API替换规则的具体步骤如下:所有的Removed类型项为规则的先导,所有Added类型项为规则的后继,若缺少任意一种类型的项,则该项集被丢弃;最后通过最小置信度对关联规则进行过滤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510173809.9A CN104820587B (zh) | 2015-04-13 | 2015-04-13 | 细粒度的基于频繁项集挖掘产生api替换规则的方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510173809.9A CN104820587B (zh) | 2015-04-13 | 2015-04-13 | 细粒度的基于频繁项集挖掘产生api替换规则的方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104820587A CN104820587A (zh) | 2015-08-05 |
CN104820587B true CN104820587B (zh) | 2018-03-02 |
Family
ID=53730891
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510173809.9A Active CN104820587B (zh) | 2015-04-13 | 2015-04-13 | 细粒度的基于频繁项集挖掘产生api替换规则的方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104820587B (zh) |
Families Citing this family (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106933630B (zh) * | 2017-03-09 | 2020-07-31 | 百度在线网络技术(北京)有限公司 | 一种客户端升级方法、装置、设备及存储介质 |
CN107862070B (zh) * | 2017-11-22 | 2021-08-10 | 华南理工大学 | 基于文本聚类的线上课堂讨论短文本即时分组方法及系统 |
US11977906B1 (en) * | 2020-11-06 | 2024-05-07 | EJ2 Communications, Inc. | Method for generating no-code automated cybersecurity tasks |
WO2022102109A1 (ja) * | 2020-11-13 | 2022-05-19 | 日本電信電話株式会社 | 差分抽出装置、差分抽出方法及びプログラム |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US2750068A (en) * | 1955-03-29 | 1956-06-12 | Sheffield Tube Corp | Container closure |
CN102043851A (zh) * | 2010-12-22 | 2011-05-04 | 四川大学 | 一种基于频繁项集的多文档自动摘要方法 |
CN103368921A (zh) * | 2012-04-06 | 2013-10-23 | 三星电子(中国)研发中心 | 用于智能设备的分布式用户建模系统和方法 |
CN103914374A (zh) * | 2012-12-31 | 2014-07-09 | 梁彬 | 基于程序切片和频繁模式提取的代码缺陷检测方法及装置 |
-
2015
- 2015-04-13 CN CN201510173809.9A patent/CN104820587B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US2750068A (en) * | 1955-03-29 | 1956-06-12 | Sheffield Tube Corp | Container closure |
CN102043851A (zh) * | 2010-12-22 | 2011-05-04 | 四川大学 | 一种基于频繁项集的多文档自动摘要方法 |
CN103368921A (zh) * | 2012-04-06 | 2013-10-23 | 三星电子(中国)研发中心 | 用于智能设备的分布式用户建模系统和方法 |
CN103914374A (zh) * | 2012-12-31 | 2014-07-09 | 梁彬 | 基于程序切片和频繁模式提取的代码缺陷检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN104820587A (zh) | 2015-08-05 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110245496B (zh) | 一种源代码漏洞检测方法及检测器和其训练方法及系统 | |
CN106843840B (zh) | 一种基于相似度分析的源代码版本演化注释复用方法 | |
CN105159715A (zh) | 一种基于抽象语法树节点变更抽取的Python代码变更提示方法 | |
CN104820587B (zh) | 细粒度的基于频繁项集挖掘产生api替换规则的方法 | |
US11775414B2 (en) | Automated bug fixing using deep learning | |
CN106843849B (zh) | 一种基于文档的库函数的代码模型的自动合成方法 | |
CN110442527B (zh) | 面向bug报告的自动化修复方法 | |
Lee et al. | Automatic detection and update suggestion for outdated API names in documentation | |
Koyuncu et al. | Impact of tool support in patch construction | |
CN110990055B (zh) | 一种基于程序分析的Pull Request功能分类方法 | |
CN111881300A (zh) | 面向第三方库依赖的知识图谱构建方法及系统 | |
CN108563561B (zh) | 一种程序隐性约束提取方法及系统 | |
CN112199115A (zh) | 基于特征相似度匹配的跨Java字节码和源代码行关联方法 | |
CN114398394A (zh) | 数据血缘解析方法、装置、设备及存储介质 | |
CN110633084B (zh) | 基于单个样例的代码转换推导方法和装置 | |
CN117195233A (zh) | 面向开源软件供应链的物料清单sbom+分析方法及装置 | |
Diamantopoulos et al. | Towards mining answer edits to extract evolution patterns in Stack Overflow | |
Greenan | Method-level code clone detection on transformed abstract syntax trees using sequence matching algorithms | |
Yang et al. | Pruning the ast with hunks to speed up tree differencing | |
CN113051161A (zh) | 基于历史代码变更信息的api误用检测方法 | |
JP5487078B2 (ja) | ソフトウェア資産整理方法及び装置 | |
Higo et al. | Toward reusing code changes | |
Zibran | Management aspects of software clone detection and analysis | |
CN114610320B (zh) | 一种基于llvm的变量类型信息修复与比较方法及系统 | |
CN114328149B (zh) | 编译时长的统计方法、装置、电子设备及可读介质 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |