CN113051161A - 基于历史代码变更信息的api误用检测方法 - Google Patents
基于历史代码变更信息的api误用检测方法 Download PDFInfo
- Publication number
- CN113051161A CN113051161A CN202110301729.2A CN202110301729A CN113051161A CN 113051161 A CN113051161 A CN 113051161A CN 202110301729 A CN202110301729 A CN 202110301729A CN 113051161 A CN113051161 A CN 113051161A
- Authority
- CN
- China
- Prior art keywords
- api
- misuse
- aug
- target
- program
- 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
Links
- 230000008859 change Effects 0.000 title claims abstract description 28
- 238000001514 detection method Methods 0.000 title claims abstract description 24
- 230000035772 mutation Effects 0.000 claims abstract description 44
- 238000000034 method Methods 0.000 claims abstract description 29
- 230000008439 repair process Effects 0.000 claims abstract description 10
- 238000012360 testing method Methods 0.000 claims abstract description 9
- 230000008569 process Effects 0.000 claims description 12
- 239000012634 fragment Substances 0.000 claims description 8
- 238000001914 filtration Methods 0.000 claims description 6
- 239000007787 solid Substances 0.000 claims description 3
- 238000000605 extraction Methods 0.000 description 4
- 238000005065 mining Methods 0.000 description 3
- 238000013459 approach Methods 0.000 description 2
- 230000007547 defect Effects 0.000 description 2
- 238000011161 development Methods 0.000 description 2
- 230000006870 function Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 230000009286 beneficial effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000013135 deep learning Methods 0.000 description 1
- 230000000694 effects Effects 0.000 description 1
- 238000005516 engineering process Methods 0.000 description 1
- 239000000284 extract Substances 0.000 description 1
- 238000012423 maintenance Methods 0.000 description 1
- 238000003058 natural language processing Methods 0.000 description 1
- 238000007781 pre-processing Methods 0.000 description 1
- 238000010845 search algorithm Methods 0.000 description 1
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3604—Software analysis for verifying properties of programs
- G06F11/3608—Software analysis for verifying properties of programs using formal methods, e.g. model checking, abstract interpretation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3684—Test management for test design, e.g. generating new test cases
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/3668—Software testing
- G06F11/3672—Test management
- G06F11/3688—Test management for test execution, e.g. scheduling of test suites
-
- 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)
- Theoretical Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Software Systems (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Computer Security & Cryptography (AREA)
- Debugging And Monitoring (AREA)
Abstract
本发明提供一种基于历史代码变更信息的API误用检测方法,属于软件工程技术领域。该方法首先从代码托管工具上拉取开源项目的历史代码变更信息,提取出API误用相关的修复信息。利用程序修复前后AUG来逆向提取程序变异算子,而不是通过人工设计变异算子,有效且高效地生成大量包含API误用的程序集。API误用集作为测试用例通过测试套件后,分析终止跟踪堆栈中的信息,如果终止堆栈跟踪信息不是目标API误用引起的,或者还包含由其他API误用引起的信息,则说明原始程序中包含API误用。避免了从大量程序中学习正确的API使用模式,提高了API误用检测的效率。
Description
技术领域
本发明属于软件工程技术领域,涉及一种用于检测软件中API错误使用(简称API误用)的技术,具体为基于历史代码变更信息的API误用检测方法。
背景技术
在软件开发过程中,为了节省软件的开发时间和提高软件开发效率,开发人员经常需要使用各种应用程序编程接口(Application Programming Interface,简称API)来复用已有的软件框架或类库。利用API信息隐藏的机制,开发人员无需访问源码或理解被调用API内部工作机制的细节,通过调用对应的API实现类中的具体方法直接可以完成相应的功能。但由于API种类众多,文档信息不够完善,更新维护不及时等原因,开发人员在学习使用API的过程中面临着严峻的挑战,导致在软件开发过程中经常存在一些潜在的误用。
API误用是指违反了API的正确使用规范,比如错误的API调用,缺失API调用或多余的API调用,这些不规范的API使用严重危害着软件的安全。例如在文件读写时,如果开发人员忘记调用close()函数关闭文件读写数据流,就会导致对系统资源的持续占用,存在内存溢出的隐患。此外,在团队协同开发过程中,一个或多个团队成员新引入对于特定程序的API,其他开发人员必须及时查看并学习API正确使用方法,这个过程在缺失文档的情况下是容易混乱且易出错的,但是这种错误在开发过程中往往不容易被发现,甚至很长一段时间内都不会被注意到,API误用给软件开发带了巨大的安全隐患。
API误用检测的技术经过多年的发展,大量的API误用检测方法相继被提出。有从大量正确的API使用中进行模式挖掘的方法,比如基于频繁项集的挖掘技术——PR-Miner。以及一种API误用的变更模式挖掘方法(专利号:CN201910030995.9),通过挖掘出的API误用的变更模式在海量开源项目中频繁出现,来检测开源项目中的API误用,利用频繁项的API误用缺陷检测方法具有很高的误报率。有从API文档出发,使用自然语言处理的技术来分析API文档,从中推断出API使用规约。这种方式不能很好地结合实际软件开发过程,导致其准确率不是很高。基于序列模式匹配的API误用缺陷检测方法的发明(专利号:CN202010972588.2),通过刻画API误用模式,然后在目标被测软件中利用搜索算法搜索符合误用模式的API调用序列,这种方式严重依赖于API误用模式刻画的效果,存在一定的局限性。有基于概率模型的API误用检测方法,比如隐马尔可夫模型的HAPI,基于深度学习的API误用检测等。基于概率的方式往往训练大量的代码,如果样本数据不够充分或局限于某个特定的项目,模型适用性往往不是很广泛。本发明不从海量代码中挖掘正确的API使用模式,而是通过修复前后的代码,在API正确使用模式到错误使用模式之间的变异过程中提取变异算子,而不是通过手工设计变异算子,大大提高了利用变异算子对客户端程序进行变异后产生的客户端API误用的生成率,从而提高了API误用检测的覆盖率和检测的准确性。
发明内容
为解决上述问题,本发明提供了一种基于历史代码变更信息的API误用检测方法。
本发明的技术方案:
一种基于历史代码变更信息的API误用检测方法,步骤如下:
步骤1、软件项目历史代码变更信息收集:从源代码托管平台上收集开源软件项目历史代码变更信息。
步骤2、提取API误用相关的变更代码:针对步骤1中收集到的开源软件项目历史代码变更信息,提取其中与API误用相关的信息,得到包含API误用的代码片段集合S与修复API误用后的代码片段集合S′。
步骤3、API使用图AUG构建:首先通过JavaParser将Java源代码解析为抽象语法树(AST),提取操作节点和控制节点;确定操作节点和控制节点之间的数据依赖关系以及总体使用顺序,用实线箭头边和虚线箭头边来分别表示控制流和数据流,节点集和边集构成了整体的API使用图AUG;将步骤2得到的代码片段集合S与S′中的代码片段转换为API使用图AUG,记为AUG(S)和AUG(S′)。
步骤4、提取变异算子:从AUG(S)到AUG(S′)代表程序修复过程,反之,从AUG(S′)到AUG(S)则代表程序一种API误用模式,每一种误用模式都包含着从API正确使用到API错误使用的变异过程,每一个变异过程对应一个变异算子;遍历修复前后代码集合,比对AUG(S′)和AUG(S)之间的不同之处,从中提取如下变异算子:1)交换API使用图中节点的顺序;2)在API使用图中添加对已有API节点的调用,形成新的调用环路;3)更改API使用图中调用节点;4)在API使用图中新增API调用节点;5)删除API使用图中的调用节点;6)删除API使用图中的控制结构;7)更改API方法参数;8)更改控制条件参数;将提取的变异算子存入变异算子集合Mu中。
步骤5、变异操作:提取待检测目标项目中包含API使用文件,将包含API使用的文件转换为AUG(target)集合;利用步骤4中的变异算子,对AUG集合进行变异,记为AUG′(target)。
步骤6、过滤变异操作:对步骤5变异得到的AUG′(target)进行过滤,去掉包含伪API误用和冗余API误用的AUG,记为AUG″(target)。
步骤7、目标项目检测:首先,将AUG″(target)集合转变为可执行的程序,得到包含API误用的程序变体集合Program(target);对所有的变体程序执行测试套件,收集终止堆栈信息Killi。
步骤8、分析终止堆栈跟踪信息:包含API误用的程序变体集合Program(target)引起的堆栈跟踪信息应该特定于此目标API误用,且目标API误用引起的跟踪信息应该位于终止堆栈跟踪的顶部;如果终止堆栈跟踪信息不是该API误用引起的,或者还包含由其他API误用引起的信息,则说明原始程序中包含API误用。
步骤9、报告检测结果:当步骤8中出现原始程序中包含API误用的情况时,计算实际API误用m的概率大小Pm,概率越大说明API误用m的出现的可能越大;最后向开发人员报告候选误用,如果候选误用数量超过三个,则只向开发人员报告排名前三的候选误用;
实际API误用m的概率大小Pm的计算公式如下,其中mt为观察到API误用m在终止跟踪堆栈中触发的次数;L代表整个终止跟踪堆栈的深度。
Pm=mt/L
本发明的有益效果:本发明方法能够有效检测软件开发中不正确的API使用,利用程序修复前后AUG来逆向提取程序变异算子,而不是通过人工设计变异算子,有效且高效地生成大量包含API误用的程序集。API误用集作为测试用例通过测试套件后,分析终止跟踪堆栈中的信息,如果终止堆栈跟踪信息不是目标API误用引起的,或者还包含由其他API误用引起的信息,则说明原始程序中包含API误用。避免了从大量程序中学习正确的API使用模式,提高了API误用检测的效率。
附图说明
图1是本发明的基于历史代码变更信息的API误用检测方法的流程示意图。
具体实施方式
以下结合附图和技术方案,进一步说明本发明的具体实施方式。
本发明方法部署在一台应用服务器上,根据实验需求安装对应的软件,如版本控制工具、数据库等。方法由预处理操作包括收集源代码和提取修复前后的代码片段、API使用图AUG的构建、变异算子的提取、变异操作、用例测试、堆栈信息分析构成。
如图1所示,基于历史代码变更信息的API误用检测按如下流程进行。主要可分为两个阶段,步骤1至步骤4为历史信息收集和变异算子提取阶段,步骤5至步骤9为API误用检测阶段。第一个阶段主要利用GitHub源代码托管平台收集开源软件历史代码变更信息,并根据收集到的API误用与修复信息,转化为修复前后的API使用图,循环遍历API使用图集合从中提取所有API变异算子,得到变异算子集合Mu。第二个阶段,利用变异算子对待检测目标项目进行变异操作,过滤包含伪API误用和冗余API误用的AUG,进而转化为可执行的程序,并经过测试套件,判断原始程序中是否包含API误用,如果包含API误用,则将候选误用报告给开发人员。
步骤1:软件项目历史代码变更信息收集。从源代码托管平台上收集开源软件项目历史代码变更信息。源代码托管平台是指能对用户代码进行版本管理的网站或工具,流行的源代码托管平台包括GitHub、BitBucket、SourceForge、GitKraken、Gitee等。GitHub是一个基于Git的大型开源代码托管平台以及版本控制系统,本发明中主要使用GitHub代码托管平台进行开源软件项目历史代码变更信息收集。在实际使用中,可根据具体需求采用其他代码托管平台或工具收集开源软件项目历史代码变更信息。
步骤2:API误用相关的代码变更信息提取。针对步骤1中收集到的开源软件项目历史代码变更信息,提取其中与API误用相关的信息,得到包含API误用的代码片段集合S与修复API误用后的代码片段集合S′。
步骤3:API使用图(API-Usage Graph,AUG)构建。首先通过JavaParser将Java源代码解析为抽象语法树(AST),提取操作节点和控制节点。确定操作节点和控制节点之间的数据依赖关系以及总体使用顺序,用实线箭头边和虚线箭头边来分别表示控制流和数据流,节点和边构成了整体的API使用图AUG。将步骤2得到的代码片段集合S与S′中的代码片段转换为API使用图AUG,记为AUG(S)和AUG(S′)。
AUG,是一个有向的、带标签的多重图,它能捕获与识别API误用相关的所有用法属性,更具体地描述了API的动态使用。
JavaParser,一种比较流行的Java语言解析器。可以将Java源代码解析为一棵抽象语法树,在此基础上能对Java代码进行分析和修改。在实际使用中,可根据具体需求采用其他Java代码解析工具。
步骤4:从修复后的API使用图集合B中的bi到修复前的API使用图集合A中的ai,从中提取一个变异算子。遍历所有的修复前后的代码集合,将提取的变异算子存入变异算子集合Mu中。比如,bi中在文件读写之后调用了file.flush(),而ai中调用的file.close(),其中file.flush()->file.close()代表着一种更改API使用图中调用节点的变异算子。
步骤5:提取待检测目标项目中包含API使用文件,将包含API使用的文件转换为AUG(target)集合。利用步骤4中的变异算子,对AUG集合进行随机变异,记为AUG′(target)。比如,删除API使用图中的调用节点、删除API使用图中的控制节点、更换API使用图中的调用节点等。
步骤6:过滤变异操作,对变异得到的AUG′(target)进行过滤,去掉包含伪API误用和冗余API误用的AUG,记为AUG″(target)。
伪API误用是指变异操作后,错误地把变异后的代码片段当成了API误用。冗余API误用是指经过变异操作后,变异结果重复的API误用代码片段。
步骤7:目标项目检测。首先,将AUG″(target)集合转变为可执行的程序,得到包含API误用的程序变体集合Program(target)。对所有的变体程序执行测试套件,收集大量的终止关系Killi。
步骤8:分析终止堆栈跟踪信息,包含API误用的程序变体集合Program(target)引起的堆栈跟踪信息应该特定于此目标API误用,且目标API误用引起的跟踪信息应该位于终止堆栈跟踪的顶部。如果终止堆栈跟踪信息不是该API误用引起的,或者还包含由其他API误用引起的信息,则说明原始程序中包含API误用。比如,目标程序变体P_mu删除了异常处理try-catch语句,但在跟踪堆栈中除了有关异常处理的信息,还包括OutOfMemoryError错误信息,通过源码追溯,发现是由于调用java.io.InputStream.read()之后未调用java.io.InputStream.close()导致的。
步骤9:当出现步骤8中所述的原始程序中包含API误用这样的情况时,利用以下公式来计算实际API误用m的概率大小Pm,概率越大说明API误用m出现的可能越大,最后向开发人员报告候选误用,如果候选误用数量超过三个,则只向开发人员报告排名前三的候选误用。其中mt为观察到API误用m在终止跟踪堆栈中触发的次数,L代表整个跟踪堆栈的深度。
Pm=mt/L。
Claims (1)
1.一种基于历史代码变更信息的API误用检测方法,其特征在于,步骤如下:
步骤1、软件项目历史代码变更信息收集:从源代码托管平台上收集开源软件项目历史代码变更信息;
步骤2、提取API误用相关的变更代码:针对步骤1中收集到的开源软件项目历史代码变更信息,提取其中与API误用相关的信息,得到包含API误用的代码片段集合S与修复API误用后的代码片段集合S′;
步骤3、API使用图AUG构建:首先通过JavaParser将Java源代码解析为抽象语法树,提取操作节点和控制节点;确定操作节点和控制节点之间的数据依赖关系以及总体使用顺序,用实线箭头边和虚线箭头边来分别表示控制流和数据流,节点集和边集构成了整体的API使用图AUG;将步骤2得到的代码片段集合S与S′中的代码片段转换为API使用图AUG,记为AUG(S)和AUG(S′);
步骤4、提取变异算子:从AUG(S)到AUG(S′)代表程序修复过程,反之,从AUG(S′)到AUG(S)则代表程序一种API误用模式,每一种误用模式都包含着从API正确使用到API错误使用的变异过程,每一个变异过程对应一个变异算子;遍历修复前后代码集合,比对AUG(S′)和AUG(S)之间的不同之处,从中提取如下变异算子:1)交换API使用图中节点的顺序;2)在API使用图中添加对已有API节点的调用,形成新的调用环路;3)更改API使用图中调用节点;4)在API使用图中新增API调用节点;5)删除API使用图中的调用节点;6)删除API使用图中的控制结构;7)更改API方法参数;8)更改控制条件参数;将提取的变异算子存入变异算子集合Mu中;
步骤5、变异操作:提取待检测目标项目中包含API使用文件,将包含API使用的文件转换为AUG(target)集合;利用步骤4中的变异算子,对AUG集合进行变异,记为AUG′(target);
步骤6、过滤变异操作:对步骤5变异得到的AUG′(target)进行过滤,去掉包含伪API误用和冗余API误用的AUG,记为AUG″(target);
步骤7、目标项目检测:首先,将AUG″(target)集合转变为可执行的程序,得到包含API误用的程序变体集合Program(target);对所有的变体程序执行测试套件,收集终止堆栈信息Killi;
步骤8、分析终止堆栈跟踪信息:包含API误用的程序变体集合Program(target)引起的堆栈跟踪信息应该特定于此目标API误用,且目标API误用引起的跟踪信息应该位于终止堆栈跟踪的顶部;如果终止堆栈跟踪信息不是该API误用引起的,或者还包含由其他API误用引起的信息,则说明原始程序中包含API误用;
步骤9、报告检测结果:当步骤8中出现原始程序中包含API误用的情况时,计算实际API误用m的概率大小Pm,概率越大说明API误用m的出现的可能越大;最后向开发人员报告候选误用,如果候选误用数量超过三个,则只向开发人员报告排名前三的候选误用;
实际API误用m的概率大小Pm的计算公式如下,其中mt为观察到API误用m在终止跟踪堆栈中触发的次数;L代表整个终止跟踪堆栈的深度;
Pm=mt/L。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301729.2A CN113051161A (zh) | 2021-03-22 | 2021-03-22 | 基于历史代码变更信息的api误用检测方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202110301729.2A CN113051161A (zh) | 2021-03-22 | 2021-03-22 | 基于历史代码变更信息的api误用检测方法 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN113051161A true CN113051161A (zh) | 2021-06-29 |
Family
ID=76514227
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202110301729.2A Pending CN113051161A (zh) | 2021-03-22 | 2021-03-22 | 基于历史代码变更信息的api误用检测方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN113051161A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114153721A (zh) * | 2021-11-16 | 2022-03-08 | 大连理工大学 | 一种基于决策树算法的api误用检测方法 |
CN115098355A (zh) * | 2022-05-13 | 2022-09-23 | 天津大学 | 基于历史数据驱动的jvm测试程序生成方法 |
-
2021
- 2021-03-22 CN CN202110301729.2A patent/CN113051161A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN114153721A (zh) * | 2021-11-16 | 2022-03-08 | 大连理工大学 | 一种基于决策树算法的api误用检测方法 |
CN115098355A (zh) * | 2022-05-13 | 2022-09-23 | 天津大学 | 基于历史数据驱动的jvm测试程序生成方法 |
CN115098355B (zh) * | 2022-05-13 | 2024-08-16 | 天津大学 | 基于历史数据驱动的jvm测试程序生成方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Zhang et al. | Robust log-based anomaly detection on unstable log data | |
CN110245496B (zh) | 一种源代码漏洞检测方法及检测器和其训练方法及系统 | |
CN109739755B (zh) | 一种基于程序追踪和混合执行的模糊测试系统 | |
Juergens et al. | Do code clones matter? | |
Giger et al. | Comparing fine-grained source code changes and code churn for bug prediction | |
CN111459799B (zh) | 一种基于Github的软件缺陷检测模型建立、检测方法及系统 | |
CN113326244B (zh) | 一种基于日志事件图和关联关系挖掘的异常检测方法 | |
CN113051161A (zh) | 基于历史代码变更信息的api误用检测方法 | |
CN113157565B (zh) | 一种基于种子用例突变的反馈式js引擎模糊测试方法及装置 | |
CN113742205A (zh) | 一种基于人机协同的代码漏洞智能检测方法 | |
CN112131122A (zh) | 一种源代码缺陷检测工具误报评估方法及装置 | |
CN114490344A (zh) | 一种基于机器学习和静态分析的软件集成测评方法 | |
CN110990282A (zh) | 一种自动化单元测试方法 | |
CN114153721B (zh) | 一种基于决策树算法的api误用检测方法 | |
CN112464237A (zh) | 一种静态代码安全诊断方法及装置 | |
CN111966578A (zh) | 一种安卓兼容性缺陷修复效果的自动化评估方法 | |
CN114996705B (zh) | 基于脆弱性类型和Bi-LSTM的跨软件脆弱性检测方法及系统 | |
Qiu et al. | Vulnerability detection via multiple-graph-based code representation | |
CN113377962B (zh) | 一种基于图像识别和自然语言处理的智能过程模拟方法 | |
Sadiq et al. | On the Evolutionary Relationship between Change Coupling and Fix-Inducing Changes. | |
CN110321130B (zh) | 基于系统调用日志的不可重复编译定位方法 | |
CN113392016A (zh) | 对程序异常情况处理的规约生成方法、装置、设备及介质 | |
Li et al. | Multilingual code refactoring detection based on deep learning | |
Wang et al. | FastTransLog: A Log-based Anomaly Detection Method based on Fastformer | |
CN111460439B (zh) | 基于多环境的逃避行为检测方法 |
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 |