CN109857648A - 一种api误用的变更模式挖掘方法 - Google Patents
一种api误用的变更模式挖掘方法 Download PDFInfo
- Publication number
- CN109857648A CN109857648A CN201910030995.9A CN201910030995A CN109857648A CN 109857648 A CN109857648 A CN 109857648A CN 201910030995 A CN201910030995 A CN 201910030995A CN 109857648 A CN109857648 A CN 109857648A
- Authority
- CN
- China
- Prior art keywords
- api
- change mode
- change
- project
- misuse
- 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.)
- Granted
Links
Abstract
本发明属于软件工程技术领域,具体为一种API误用的变更模式挖掘方法。本发明从代码托管服务上海量开源项目的变更提交历史中选取出修复API误用的变更提交,通过分析变更提交的细粒度代码差异来抽取API误用的变更方式,对API误用的变更方式的项目间频次(在开源项目中出现的项目数)和项目内频次(在所有开源项目中出现的次数)进行排序得到API误用的变更模式。本发明所挖掘出的API误用的变更模式在海量开源项目中频繁出现,可以用来检测开源项目中的API误用,从而提高开源项目的质量。
Description
技术领域
本发明属于软件工程技术领域,具体涉及一种API误用的变更模式挖掘方法。
背景技术
第三方库和框架通常以API的方式提供给软件开发人员使用,从而提高软件开发的效率和软件系统的质量。然而,在实践中,即使对于非常有经验的开发人员,学习和使用API是一件非常困难的事情。这主要归因于以下几个问题:API的使用约束通常是隐含的假设、API之间的组合调用往往是非常复杂的、API的文档经常是不完整或者含有二义性的、API由于自身演化而变得不稳定。这就使得开发人员经常误用API,导致未知的软件行为或者软件缺陷(包括功能缺陷、性能缺陷、安全缺陷、兼容性问题等)。
开源项目中存在着大量关于API使用的知识,而且代码托管服务上的开源项目正快速增长,这些都促成了API使用模式挖掘的发展。目前的API使用模式主要有三种表示形式。第一种表示是一个API调用集合,例如{FileInputStream.read,FileInputStream.close}。这个集合中的API调用经常在一起频繁使用,但不区分调用的次序,例如只要调用FileInputStream.read就需要调用FileInputStream.close,反之亦然。第二种表示是一个API调用的序列,例如FileInputStream.read->FileInputStream.close。这个序列表示一组API经常以固定的先后顺序被调用,例如FileInputStream.close不能在FileInputStream.read之前被调用。第三种表示是API调用的前置条件,表示一个API在被调用之前必须要满足某种前置条件,例如File.createNewFile在被调用之前File.exists必须要返回false。以上三种模式都关注于API调用的上下文关系,而并没有关注API调用本身的信息,例如API调用的参数设置是否正确、是否在一组类似的API中选择了一个合适的API、API调用的返回值是否进行了特殊值的额外判断等。本发明所关注的挖掘方法针对API调用本身。
发明内容
本发明的目的是提供一种API误用的变更模式挖掘方法,从而识别开源项目中常见的API误用及其变更模式,从而便于在开源项目中检测API误用并提高开源项目的质量。
为了达到上述目的,本发明提供一种API误用的变更模式挖掘方法,其包括以下:
(1)从代码托管服务上开源项目的变更提交历史中,根据启发式规则选择与修复API误用相关的变更提交;
(2)针对每个变更提交,进行变更提交前后开源项目在抽象语法树上的代码差异分析,并抽取和分析API误用的变更方式;
(3)对API误用的变更方式进行项目间频次以及项目内频次的统计,并通过加权排序得到API误用的变更模式。
本发明中,步骤(1)中所使用的启发式规则是选择缺陷修复的变更提交。API误用会导致软件缺陷,本发明在变更提交日志中通过关键字匹配的方式来选择缺陷修复的变更提交。本发明所使用的关键字包括“bug”、“fix”、“patch”、“performance”、“slow”、“throughput”、“security”、“insecure”、“compatibility”、以及“compatible”。这些关键字是为了覆盖各种软件缺陷(包括功能缺陷、性能缺陷、安全缺陷、以及兼容性缺陷)。
本发明中,步骤(2)中所使用的抽象语法树代码差异分析可以得到一个编辑操作序列,每个编辑操作是对抽象语法树上一个结点的增、删、改、移。这个编辑操作序列可以把变更前的抽象语法树转换为变更后的抽象语法树。通过遍历这个编辑操作序列并根据各个编辑操作所在的结点类型,可以判断是否是一个API调用的参数、方法名、或者对象发生了变更。这三种变更方式分别对应于API调用参数的修改(例如,Thread.sleep(long)的参数被修改)、同类API调用的替换(例如,System.currentTimeMillis()被替换为System.nanoTime())、以及异类API调用的替换(例如,StringBuffer.append(char)被替换为StringBuilder.append(char))。
步骤(3)中对各个API误用的变更方式进行项目间频次fcr(即在开源项目中出现的总项目数)以及项目内频次fin(即在所有开源项目中出现的总次数)的计数统计,并对这两个计数统计根据公式p=w*(fin-fin min)/(fin max-fin min)+(1-w)*(fcr-fcr min)/(fcr max-fcr min)进行归一化并计算API误用的变更方式在项目内和项目间的加权和。其中,w是权重,fin min和fin max是所有API误用的变更方式关于项目内频次的最小值和最大值,fcr min和fcr max是所有API误用的变更方式关于项目间频次的最小值和最大值。最后通过对加权和的排序得到常见的API误用的变更模式(例如,StringBuffer.append(char)被替换为StringBuilder.append(char))。
本发明由于采用了上述的技术方案,使之与现有的技术相比,具有以下的优点和积极效果:本发明关注于API调用本身的误用情况,可以挖掘出API调用本身的误用模式,从而便于在开源项目中检测API误用并提高开源项目的质量。
附图说明
图1为本发明的基本过程示意图。
具体实施方式
图1为本发明的基本过程示意图。本节给出了一个基于GitHub开源项目以及JavaSE 8API的具体实施方式。基于该实施方式的主要使用过程为:
(1)选择GitHub上星数大于1000的Java开源项目,总共为1162个Java开源项目。这些开源项目中总共包含了3191057个变更提交。
(2)通过匹配关键字“bug”、“fix”、“patch”、“performance”、“slow”、“throughput”、“security”、“insecure”、“compatibility”、以及“compatible”从3191057个变更提交中选择出320222个与修复软件缺陷有关的变更提交。
(3)针对320222个变更提交中的每个变更提交,通过代码差异分析抽取出12508个误用Java SE 8API的变更方式。
(4)通过项目间和项目内的频次统计挖掘出676个Java SE 8API误用的变更模式。针对30个最常见的API误用的变更模式,人工分析了它们所对应的1262个API变更方式,发现误报率为11.4%,即11.4%的API变更方式跟缺陷修复和API误用无关。此外,利用其中的4个API误用的变更模式,在开源项目中发现了26个新的API误用缺陷。
Claims (5)
1.一种API误用的变更模式挖掘方法,其特征在于,包括如下步骤:
(1)从代码托管服务上开源项目的变更提交历史中,根据启发式规则选择与修复API误用相关的变更提交;
(2)针对每个变更提交,进行变更提交前后开源项目在抽象语法树上的代码差异分析,并抽取和分析API误用的变更方式;
(3)对API误用的变更方式进行项目间频次以及项目内频次的统计,并通过加权排序得到API误用的变更模式。
2.根据权利要求1所述的变更模式挖掘方法,其特征在于,步骤(1)中,在变更提交日志中通过关键字匹配的方式选择缺陷修复的变更提交。
3.根据权利要求2所述的变更模式挖掘方法,其特征在于,关键字包括“bug”、“fix”、“patch”、“performance”、“slow”、“throughput”、“security”、“insecure”、“compatibility”、以及“compatible”。
4.根据权利要求1所述的变更模式挖掘方法,其特征在于,步骤(2)中,使用了基于抽象语法树的代码差异分析来抽取API误用的变更方式,通过遍历代码差异分析而来的编辑操作序列并根据各个编辑操作所在的结点类型,判断并抽取API调用参数的修改、同类API调用的替换、以及异类API调用的替换这三种API误用的变更方式。
5.根据权利要求1所述的变更模式挖掘方法,其特征在于,步骤(3)中,使用了项目间频次fcr和项目内fin频次来对各个API误用的变更模式进行加权和和排序,从而挖掘常见的变更模式;其中:项目间频次fcr表示API误用的变更方式在开源项目中出现的总项目数,而项目内频次fin表示API误用的变更方式在所有开源项目中出现的总次数;
通过如下公式计算对API误用的变更方式在项目内和项目间的加权和:
p=w*(fin-fin min)/(fin max-fin min)+(1-w)*(fcr-fcr min)/(fcr max-fcr min)
其中:w是权重,fin min和fin max是所有API误用的变更方式关于项目内频次的最小值和最大值,fcr min和fcr max是所有API误用的变更方式关于项目间频次的最小值和最大值。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910030995.9A CN109857648B (zh) | 2019-01-14 | 2019-01-14 | 一种api误用的变更模式挖掘方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201910030995.9A CN109857648B (zh) | 2019-01-14 | 2019-01-14 | 一种api误用的变更模式挖掘方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN109857648A true CN109857648A (zh) | 2019-06-07 |
CN109857648B CN109857648B (zh) | 2021-12-28 |
Family
ID=66894577
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201910030995.9A Active CN109857648B (zh) | 2019-01-14 | 2019-01-14 | 一种api误用的变更模式挖掘方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN109857648B (zh) |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111290777A (zh) * | 2020-01-23 | 2020-06-16 | 复旦大学 | 一种面向软件代码单元和代码度量的演化历史切片方法 |
CN111858322A (zh) * | 2020-07-10 | 2020-10-30 | 中国科学技术大学 | 一种Python语言特征自动识别系统和方法 |
CN112115053A (zh) * | 2020-09-16 | 2020-12-22 | 北京京航计算通讯研究所 | 基于序列模式匹配的api误用缺陷检测方法 |
CN112214399A (zh) * | 2020-09-16 | 2021-01-12 | 北京京航计算通讯研究所 | 基于序列模式匹配的api误用缺陷检测系统 |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
CN104699611A (zh) * | 2015-03-18 | 2015-06-10 | 北京航空航天大学 | 一种基于开源软件缺陷代码修改模式的缺陷信息提取方法 |
KR101548364B1 (ko) * | 2014-10-22 | 2015-08-28 | 경북대학교 산학협력단 | Api 호출 정당성의 자동검증 방법, 이를 수행하기 위한 기록 매체 및 장치 |
CN105159715A (zh) * | 2015-09-01 | 2015-12-16 | 南京大学 | 一种基于抽象语法树节点变更抽取的Python代码变更提示方法 |
CN107133079A (zh) * | 2017-05-25 | 2017-09-05 | 中国人民解放军国防科学技术大学 | 一种基于问题报告的软件语义摘要自动生成方法 |
-
2019
- 2019-01-14 CN CN201910030995.9A patent/CN109857648B/zh active Active
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101017458A (zh) * | 2007-03-02 | 2007-08-15 | 北京邮电大学 | 基于源代码静态分析的软件安全代码分析器及其检测方法 |
KR101548364B1 (ko) * | 2014-10-22 | 2015-08-28 | 경북대학교 산학협력단 | Api 호출 정당성의 자동검증 방법, 이를 수행하기 위한 기록 매체 및 장치 |
CN104699611A (zh) * | 2015-03-18 | 2015-06-10 | 北京航空航天大学 | 一种基于开源软件缺陷代码修改模式的缺陷信息提取方法 |
CN105159715A (zh) * | 2015-09-01 | 2015-12-16 | 南京大学 | 一种基于抽象语法树节点变更抽取的Python代码变更提示方法 |
CN107133079A (zh) * | 2017-05-25 | 2017-09-05 | 中国人民解放军国防科学技术大学 | 一种基于问题报告的软件语义摘要自动生成方法 |
Non-Patent Citations (5)
Title |
---|
KAIFENG HUANG 等: "ClDiff: generating concise linked code differences", 《ASSOCIATION FOR COMPUTING MACHINERY》 * |
NIELEBOCK SEBASTIAN 等: "Commits as a Basis for API Misuse Detection", 《PROCEEDINGS OF THE 7TH INTERNATIONAL WORKSHOP ON SOFTWARE MINING》 * |
ZHANG TIANYI 等: "Are Code Examples on an Online Q amp;A Forum Reliable?: A Study of API Misuse on Stack Overflow", 《2018 IEEE/ACM 40TH INTERNATIONAL CONFERENCE ON SOFTWARE ENGINEERING (ICSE)》 * |
史橹 等: "JavaScript代码分析技术综述", 《计算机应用与软件》 * |
李正 等: "API使用的关键问题研究", 《软件学报》 * |
Cited By (6)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111290777A (zh) * | 2020-01-23 | 2020-06-16 | 复旦大学 | 一种面向软件代码单元和代码度量的演化历史切片方法 |
CN111290777B (zh) * | 2020-01-23 | 2021-09-17 | 复旦大学 | 一种面向软件代码单元和代码度量的代码变更序列方法 |
CN111858322A (zh) * | 2020-07-10 | 2020-10-30 | 中国科学技术大学 | 一种Python语言特征自动识别系统和方法 |
CN112115053A (zh) * | 2020-09-16 | 2020-12-22 | 北京京航计算通讯研究所 | 基于序列模式匹配的api误用缺陷检测方法 |
CN112214399A (zh) * | 2020-09-16 | 2021-01-12 | 北京京航计算通讯研究所 | 基于序列模式匹配的api误用缺陷检测系统 |
CN112214399B (zh) * | 2020-09-16 | 2023-01-10 | 北京京航计算通讯研究所 | 基于序列模式匹配的api误用缺陷检测系统 |
Also Published As
Publication number | Publication date |
---|---|
CN109857648B (zh) | 2021-12-28 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN109857648A (zh) | 一种api误用的变更模式挖掘方法 | |
US8037452B2 (en) | Task aware source checkin and build | |
US8312440B2 (en) | Method, computer program product, and hardware product for providing program individuality analysis for source code programs | |
Cito et al. | Counterfactual explanations for models of code | |
US10664382B2 (en) | System and method for tool chain data capture through parser for empirical data analysis | |
CN111753303B (zh) | 一种基于深度学习和强化学习的多粒度代码漏洞检测方法 | |
US10417115B1 (en) | System, method, and computer program for performing production driven testing | |
KR102160780B1 (ko) | 버그 정정 시스템 및 버그 정정 방법 | |
Aversano et al. | Evaluating architecture stability of software projects | |
Dehlinger et al. | Plfaultcat: A product-line software fault tree analysis tool | |
US20220237057A1 (en) | Code consolidation system | |
CN109753286A (zh) | 一种基于功能标签的代码方法统计其调用次数的方法 | |
Nam et al. | Marble: Mining for boilerplate code to identify API usability problems | |
CN116305158A (zh) | 一种基于切片代码依赖图语义学习的漏洞识别方法 | |
CN109656615A (zh) | 一种基于代码方法重要程度进行权限预警的方法 | |
Zhang et al. | Improving maintenance-consistency prediction during code clone creation | |
CN111258876B (zh) | 一种微服务架构下的精确回归测试方法及装置 | |
Krinke et al. | Bigclonebench considered harmful for machine learning | |
Zhout et al. | The devil is in the tails: How long-tailed code distributions impact large language models | |
Legeard et al. | A comparison of the BTT and TTF test-generation methods | |
Zhang et al. | Predicting consistent clone change | |
CN109542496B (zh) | 增量代码确定方法、装置及系统 | |
Ufuktepe et al. | Tracking code bug fix ripple effects based on change patterns using markov chain models | |
Tinnes et al. | Learning domain-specific edit operations from model repositories with frequent subgraph mining | |
Rahmoun et al. | Automatic selection and composition of model transformations alternatives using evolutionary algorithms |
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 |