CN106095443B - 一种基于c/c++代码库的api调用模式挖掘方法 - Google Patents
一种基于c/c++代码库的api调用模式挖掘方法 Download PDFInfo
- Publication number
- CN106095443B CN106095443B CN201610412437.5A CN201610412437A CN106095443B CN 106095443 B CN106095443 B CN 106095443B CN 201610412437 A CN201610412437 A CN 201610412437A CN 106095443 B CN106095443 B CN 106095443B
- Authority
- CN
- China
- Prior art keywords
- sequence
- api
- function
- information
- code
- 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
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
Abstract
没本发明公开了一种基于C/C++代码库的API调用模式挖掘方法。本方法的输入是C/C++代码库,首先通过开源的基于LLVM的clang编译器对输入代码库进行编译,利用clang提供的相关扩展接口完成API序列信息的提取;然后对API序列进行预处理,将相同的API序列合并成一条序列及将嵌套使用的序列进行关联处理;然后将预处理好的API序列存储到数据库中;然后计算数据库中API序列间的距离,得到距离矩阵;然后根据API序列间的距离矩阵,使用DBScan聚类算法对API序列进行聚类处理,将聚类结果存储到数据库中;最后用户输入函数片段信息,利用数据库查询技术将符合要求的API序列及对应的使用代码片段返回给用户。
Description
技术领域
基于C/C++语言的软件开发人员对API使用都基于手工查找和搜索引擎查找,要找到真正需要的内容十分困难,现在的代码搜索技术虽然可以找到API使用相关的代码,但通过这种方式可以找到的代码片段非常多,逐一分析也很费时。本方法就是基于C/C++代码库的API调用模式的挖掘方法,应用在软件开发领域,提高软件开发效率。
背景技术
对于技术开发公司来说,每个公司都有自己的代码库,并且是海量的。海量的数据库对于技术开发公司来说是个资源,公司又怎么利用该资源呢?技术开发人员要利用开放的接口-API(ApplicationProgrammingInterface)完成特定的功能,一种特定的功能对应着一条API序列,公司有庞大的代码库,具有相同功能的API序列会反复出现,这种反复出现的API序列即为开发人员的一种使用模式,技术开发公司希望能从以往的开发项目中(即公司代码库)挖掘出API调用序列模式,技术开发人员可以根据片段信息(比如一个接口函数)查询到相关的API调用模式供开发之用,或者将调用模式API序列定义标准化代码接口封装,从而大大提高项目开发效率。比如关于文件的操作,不同程序员写的代码风格不同,但是都对应这样一种使用模式:fileopen->filehandle->fileclose,filehandle可能是read文件、write文件等,程序员要完成文件的相关操作,但是他只知道一个fileopen函数接口,程序员就可以利用这个接口函数查询得到文件操作的调用模式,极大方便了程序员。或者将文件操作的调用模式序列形成标准化代码定义接口封装,进而大大提高代码重用率,提高项目开发效率。
针对实际应用,利用开源clang编译器完成代码库的序列信息提取及存储,然后设计API序列距离计算方法,利用DBScan算法完成序列聚类。
发明内容
本发明针对基于C/C++代码库的API调用模式的挖掘方法,解决软件公司如何利用C/C++代码库,应用在软件开发领域,提高软件开发效率。
为解决上述技术问题,本发明采用以下技术方案:
基于C/C++代码库的API调用模式的挖掘方法,其包括如下步骤:
(1)clang编译C/C++代码库,提取代码API序列信息;
(2)对API序列信息预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列;
(3)API序列数据库存储,将预处理后的API序列中的函数统一编号后,对函数及其参数类型信息进行存储,后将API序列函数名转化为编号后存储;
(4)计算API序列距离矩阵;
(5)利用距离矩阵,使用DBScan算法,将API序列进行聚类处理;
(6)用户查询数据库,将匹配的API序列及对应代码片段返回给用户。
作为优选,所述步骤(1)中,clang编译C/C++代码库,提取代码API序列信息过程如下:
(11)clang编译C/C++代码库;
(12)利用clang扩展接口,实例化ASTFrontendAction类,调用ASTFrontendAction类中方法-ASTConsumer,获取源代码对应的AST(抽象语法树)的入口;
(13)深度优先遍历AST,将节点函数名、参数类型信息、返回参数类型信息、命名空间信息、上下文信息(源代码所在路径)记录存储到内存中,若函数是常用库函数,则进行过滤不存储处理,即提取API序列信息并存储。
作为优选,所述步骤(2)中,API序列预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列,过程如下:
(21)根据函数名、参数类型、返回参数类型,将API序列相同的序列合并成一条序列,并记录该序列出现的次数,如三条API序列信息,序列S1:intA(int,int)->intB(int,int),序列S2:intA(int,int)->intB(int,int),序列S3:intA(int,double)->intB(int,int),S1与S2序列相同,则S1与S2只记录一个序列信息并且将序列次数记录为2,S3序列与S2因为参数类型不同则不做合并处理;
(22)将具有镶嵌关系的函数进行展开处理,如主方法中序列为A、B、C,另外方法C为D、E,将序列ABC与序列DE关联成一条序列ABDE。
作为优选,所述步骤(3)中,API序列数据库存储,将预处理后的API序列中的函数统一编号后,先对函数进行存储,后将API序列函数名转化为编号后存储步骤如下:
(31)预处理后的API序列逐条处理,若当前处理的方法还未在数据库中,将方法名、所属类名、参数信息存储到方法表中,若当前处理的方法在方法表中,当前方法处理结束,方法表中主键即为该方法的编号。
(32)将预处理后的序列批量插入到未聚类的API序列表中,首先将API序列中方法名转化为方法表中对应编号,后将转化后的编号序列、序列出现次数、对应代码路径、对应代码起始位置及结束位置信息存储到未聚类的序列表中。
作为优选,所述步骤(4)中,计算API序列距离矩阵步骤如下:
(41)对于N条API序列,初始化N×N矩阵,对角线位置值设置为零,其它位置设置成数1;
(42)对于m行n列值,取出第m条序列及第n条序列,这两条序列是由函数编号组成的集合;
(43)两条序列是集合,将两条集合取并操作形成新集合S;
(44)统计出两条序列不同元素的个数为d;
(45)计算其中|S|为新集合S中元素个数。该值即为m行n列值;
(46)重复步骤(42)-(45),直至该矩阵上三角值全部更新。
作为优选,所述步骤(5)中,利用距离矩阵,使用DBScan算法,将API序列进行聚类处理步骤如下:
(51)为N条序列设置一个N维标记数组,标记数组记录每一条序列所属簇,初始化标记数组为0;
(52)设置聚类参数,扫描半径eps在0.45-0.55之间,最小包含点数MinPts在3-5之间;
(53)查询距离矩阵,利用DBScan算法对N条序列聚类,聚类过程中将标记数组值更新;
(54)API序列存储到数据库中,属于同一簇的API序列记录其簇号,同时记录聚类数据库中序列与未聚类数据库序列间的映射关系。
作为优选,所述步骤(6)中,用户查询数据库,将匹配的API序列及对应代码片段返回给用户步骤如下:
(61)获取用户输入的函数信息;
(62)查询聚类数据库,得到符合要求的序列;
(63)根据记录聚类数据库中序列与未聚类数据库序列间的映射关系,得到序列出现次数及对应的代码片段信息;
(64)根据(63)中得到的序列出现次数进行排序,将序列及对应代码片段输出。
与现有技术相比,本发明的优点在于:
一、提出基于C/C++代码库API序列提取方法;
二、提出基于C/C++代码库API序列存取方法;
三、提出基于C/C++代码库API序列聚类方法;
四、提出基于C/C++代码库API序列调用模式的使用方法。
五、支持重载函数和函数作用域等C++语法分析。
六、支持百万行级C/C++代码的API使用模式挖掘。
附图说明
图1为本发明的结构流程示意图;
图2为本发明的整体流程示意图;
具体实施方式
下面将结合附图及具体实施方式对本发明作进一步的描述。
参阅图1,一种基于C/C++代码库的API调用模式挖掘方法,首先对输入的C/C++代码库利用clang编译器API序列提取,后对提取的API序列预处理,然后对API序列进行聚类处理并存储到数据库中,最后根据用户输入的函数对数据库搜索并将符合要求的结果返回。
在方法设计之初,首先通过开源的基于LLVM的clang编译器对输入代码库进行编译,利用clang提供的相关扩展接口完成API序列信息的提取;然后对API序列进行预处理,将相同的API序列合并成一条序列及将嵌套使用的序列进行关联处理;然后将预处理好的API序列存储到数据库中;然后计算数据库中API序列间的距离,得到距离矩阵;然后根据API序列间的距离矩阵,使用DBScan聚类算法对API序列进行聚类处理,将聚类结果存储到数据库中;最后用户输入函数片段信息,利用数据库查询技术将符合要求的API序列及对应的使用代码片段返回给用户。如图2所示,其具体设计过程如下:
一种基于C/C++代码库的API调用模式挖掘方法,步骤如下:
(1)clang编译C/C++代码库,提取代码API序列信息过程如下:
(11)clang编译C/C++代码库;
(12)利用clang扩展接口,实例化ASTFrontendAction类,调用ASTFrontendAction类中方法-ASTConsumer,获取源代码对应的AST(抽象语法树)的入口;
(13)深度优先遍历AST,将节点函数名、参数类型信息、返回参数类型信息、命名空间信息、上下文信息(源代码所在路径)记录存储到内存中,若函数是常用库函数,则进行过滤不存储处理,即提取API序列信息并存储。
(2)对API序列信息预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列,过程如下:
(21)根据函数名、参数类型、返回参数类型,将API序列相同的序列合并成一条序列,并记录该序列出现的次数,如三条API序列信息,序列S1:intA(int,int)->intB(int,int),序列S2:intA(int,int)->intB(int,int),序列S3:intA(int,double)->intB(int,int)S1与S2序列相同,则S1与S2只记录一个序列信息并且将序列次数记录为2,S3序列与S2因为参数类型不同则不做合并处理;
(22)将具有镶嵌关系的函数进行展开处理,如主方法中序列为A、B、C,另外方法C为D、E,将序列ABC与序列DE关联成一条序列ABDE。
(3)API序列数据库存储,将预处理后的API序列函数统一编号后,先对方法进行存储,后将API序列函数名转化为编号后存储,过程如下:
(31)预处理后的API序列逐条处理,若当前处理的方法还未在数据库中,将方法名、所属类名、参数信息存储到方法表中,若当前处理的方法在方法表中,当前方法处理结束,方法表中主键即为该方法的编号。
(32)将预处理后的序列批量插入到未聚类的API序列表中,首先将API序列中方法名转化为方法表中对应编号,后将转化后的编号序列、序列出现次数、对应代码路径、对应代码起始位置及结束位置信息存储到未聚类的序列表中。
(4)计算API序列距离矩阵过程如下:
(41)对于N条API序列,初始化N×N矩阵,对角线位置值设置为零,其它位置设置成数1;
(42)对于m行n列值,取出第m条序列及第n条序列,这两条序列是由函数编号组成的集合;。
(43)两条序列是集合,将两条集合取并操作形成新集合S;
(44)统计出两条序列不同元素的个数为d;
(45)计算其中|S|为新集合S中元素个数。该值即为m行n列值;
(46)重复步骤(42)-(45),直至该矩阵上三角值全部更新。
(5)利用距离矩阵,使用DBScan算法,将API序列进行聚类处理,过程如下:
(51)为N条序列设置一个N维标记数组,标记数组记录每一条序列所属簇,初始化标记数组为0;
(52)设置聚类参数,扫描半径eps在0.45-0.55之间,最小包含点数MinPts在3-5之间;
(53)查询距离矩阵,利用DBScan算法对N条序列聚类,聚类过程中将标记数组值更新;
(54)API序列存储到数据库中,属于同一簇的API序列记录其簇号,同时记录聚类数据库中序列与未聚类数据库序列间的映射关系。
(6)用户查询数据库,将匹配的API序列及对应代码片段返回给用户,过程如下:
(61)获取用户输入的函数信息;
(62)查询聚类数据库,得到符合要求的序列;
(63)根据记录聚类数据库中序列与未聚类数据库序列间的映射关系,得到序列出现次数及对应的代码片段信息;
(64)根据(63)中得到的序列出现次数进行排序,将序列及对应代码片段输出。
Claims (5)
1.一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,如下步骤:
步骤(1)、clang编译C/C++代码库,提取代码API序列信息;
步骤(2)、对API序列信息预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列;
步骤(3)、API序列数据库存储,将预处理后的API序列中的函数统一编号后,对函数及其参数类型信息进行存储,后将API序列函数名转化为编号后存储;
步骤(4)、计算API序列距离矩阵;
步骤(5)、利用距离矩阵,使用DBScan算法,将API序列进行聚类处理;
步骤(6)、用户查询数据库,将匹配的API序列及对应代码片段返回给用户;
所述步骤(4)中,计算API序列距离矩阵,m行n列值表示第m条序列与第n条序列之间的距离,该矩阵为对称矩阵,只需计算上三角矩阵值即可,步骤如下:
(41)对于N条API序列,初始化N×N矩阵,对角线位置值设置为零,其它位置设置成数1;
(42)对于m行n列值,取出第m条序列及第n条序列,这两条序列是由函数编号组成的集合;
(43)两条序列是集合,将两条集合取并操作形成新集合S;
(44)统计出两条序列不同元素的个数为d;
(45)计算其中|S|为新集合S中元素个数,该值即为m行n列值;
(46)重复步骤(42)-(45),直至该矩阵上三角值全部更新;
所述步骤(5)中,利用距离矩阵,为N条序列设置N维标记数组A,标记数组记录每一条序列所属簇,第m条序列簇号为Am值,使用DBScan算法,将API序列进行聚类处理,将标记数组更新,后将聚类结果存储到数据库中,步骤如下:
(51)为N条序列设置一个N维标记数组,标记数组记录每一条序列所属簇,初始化标记数组为0;
(52)设置聚类参数,扫描半径eps在0.45-0.55之间,最小包含点数MinPts在3-5之间;
(53)查询距离矩阵,利用DBScan算法对N条序列聚类,聚类过程中将标记数组值更新;
(54)API序列存储到数据库中,属于同一簇的API序列记录其簇号,同时记录聚类数据库中序列与未聚类数据库序列间的映射关系。
2.根据权利要求1所述的一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,所述步骤(1)中,clang编译C/C++代码库,提取代码API序列信息,步骤如下:
(11)clang编译C/C++代码库;
(12)利用clang扩展接口,实例化ASTFrontendAction类,调用ASTFrontendAction类中方法-ASTConsumer,获取源代码对应的抽象语法树 AST的入口;(13)深度优先遍历AST,将节点函数名、参数类型信息、返回参数类型信息、命名空间信息、上下文信息记录存储到内存中,若函数是常用库函数,则进行过滤不存储处理,即将API序列信息提取并存储。
3.根据权利要求1所述的一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,所述步骤(2)中,对API序列信息预处理,具体步骤如下:
(21)根据函数名、参数类型、返回参数类型,将API序列相同的序列合并成一条序列,并记录该序列出现的次数;
(22)将具有镶嵌关系的函数进行展开处理。
4.根据权利要求1所述的一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,所述步骤(3)中,API序列数据库存储,将预处理后的API序列中的函数统一编号后,先对API函数进行存储,后将API序列函数名转化为编号后存储,步骤如下:
(31)预处理后的API函数序列逐条处理,若当前处理的API函数还未在数据库中,将API函数名、所属类名、参数信息存储到函数表中,若当前处理的API函数在函数表中,当前处理的API函数处理结束,函数表中主键即为该API函数的编号;
(32)将预处理后的序列批量插入到未聚类的API序列表中,首先将API序列中函数名转化为函数表中对应编号,后将转化后的编号序列、序列出现次数、对应代码路径、对应代码起始位置及结束位置信息存储到未聚类的序列表中。
5.根据权利要求1所述的一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,所述步骤(6)中,根据用户输入的函数信息,将符合查询要求的序列及对应代码片段返回给用户,步骤如下:
(61)获取用户输入的函数信息;
(62)查询聚类数据库,得到符合要求的序列;
(63)根据记录聚类数据库中序列与未聚类数据库序列间的映射关系,得到序列出现次数及对应的代码片段信息;
(64)根据(63)中得到的序列出现次数进行排序,将序列及对应代码片段输出。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610412437.5A CN106095443B (zh) | 2016-06-14 | 2016-06-14 | 一种基于c/c++代码库的api调用模式挖掘方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201610412437.5A CN106095443B (zh) | 2016-06-14 | 2016-06-14 | 一种基于c/c++代码库的api调用模式挖掘方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN106095443A CN106095443A (zh) | 2016-11-09 |
CN106095443B true CN106095443B (zh) | 2019-04-05 |
Family
ID=57845222
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201610412437.5A Active CN106095443B (zh) | 2016-06-14 | 2016-06-14 | 一种基于c/c++代码库的api调用模式挖掘方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN106095443B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN110716743B (zh) * | 2019-09-30 | 2023-07-28 | 上海一竹网络科技有限公司 | 一种适合多方协作开发的聚合api开发方法及系统 |
CN113901177B (zh) * | 2021-10-27 | 2023-08-08 | 电子科技大学 | 一种基于多模态属性决策的代码搜索方法 |
CN114356319A (zh) * | 2021-12-31 | 2022-04-15 | 山东浪潮科学研究院有限公司 | 一种根据自然语言描述推荐api的方法 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359352A (zh) * | 2008-09-25 | 2009-02-04 | 中国人民解放军信息工程大学 | 分层协同的混淆后api调用行为发现及其恶意性判定方法 |
CN103473507A (zh) * | 2013-09-25 | 2013-12-25 | 西安交通大学 | 一种基于方法调用图的Android恶意软件检测方法 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US9104525B2 (en) * | 2013-01-22 | 2015-08-11 | Microsoft Technology Licensing, Llc | API usage pattern mining |
-
2016
- 2016-06-14 CN CN201610412437.5A patent/CN106095443B/zh active Active
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101359352A (zh) * | 2008-09-25 | 2009-02-04 | 中国人民解放军信息工程大学 | 分层协同的混淆后api调用行为发现及其恶意性判定方法 |
CN103473507A (zh) * | 2013-09-25 | 2013-12-25 | 西安交通大学 | 一种基于方法调用图的Android恶意软件检测方法 |
Non-Patent Citations (2)
Title |
---|
MAPO: Mining and Recommending API Usage Patterns;Hao Zhong et al.;《ECOOP 2009: ECOOP 2009 – Object-Oriented Programming》;20091231;318-343 * |
Mining API Patterns as Partial Orders from Source Code: From Usage Scenarios to Specifications;Mithun Acharya et al.;《ESEC-FSE "07 Proceedings of the the 6th joint meeting of the European software engineering conference and the ACM SIGSOFT symposium on The foundations of software engineering》;20070907;25-34 * |
Also Published As
Publication number | Publication date |
---|---|
CN106095443A (zh) | 2016-11-09 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US5659723A (en) | Entity/relationship to object oriented logical model conversion method | |
CN107918666B (zh) | 一种区块链上的数据同步方法和系统 | |
JP4955876B2 (ja) | クエリ最適化のためのコストに基づく具体化ビューの選択 | |
CN103942228A (zh) | 规则引擎、计算方法、业务系统及调用方法 | |
CN105159715A (zh) | 一种基于抽象语法树节点变更抽取的Python代码变更提示方法 | |
CN106547809A (zh) | 将复合关系表示在图数据库中 | |
CN102033748A (zh) | 一种数据处理流程代码的生成方法 | |
David et al. | Conceptual models for geometry and quality of geographic information | |
CN106095443B (zh) | 一种基于c/c++代码库的api调用模式挖掘方法 | |
CN103425740B (zh) | 一种面向物联网的基于语义聚类的物资信息检索方法 | |
CN103186541A (zh) | 一种映射关系生成方法及装置 | |
US11341418B2 (en) | Ascriptive and descriptive entities for process and translation: a limited iterative ontological notation | |
CN101093513A (zh) | 一种用于解决计算机软件多语言支持问题的方法和系统 | |
CN109241104A (zh) | 决策型分布式数据库系统中aisql的解析器及其实现方法 | |
CN105404637B (zh) | 数据挖掘方法和装置 | |
Tiwari et al. | Pattern warehouse: context based modeling and quality issues | |
CN109657803A (zh) | 机器学习模型的构建 | |
CN109992271B (zh) | 一种基于代码词汇和结构依赖的分层架构识别方法 | |
Fan et al. | Detecting difference between process models based on the refined process structure tree | |
Tiwari et al. | P²MS: a phase-wise pattern management system for pattern warehouse | |
Stoter et al. | A data model for multi-scale topographical data | |
CN108845793A (zh) | 一种orm设计方法及装置 | |
CN104537047A (zh) | 一种基于Lucene的服装基样板检索系统 | |
CN108595164A (zh) | 一种数据格式与Java对象的转换方法 | |
Miller et al. | Warehousing structured and unstructured data for data mining |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |