一种基于C/C++代码库的API调用模式挖掘方法技术

技术编号:13981011 阅读:707 留言:0更新日期:2016-11-12 11:29
没本发明专利技术公开了一种基于C/C++代码库的API调用模式挖掘方法。本方法的输入是C/C++代码库,首先通过开源的基于LLVM的clang编译器对输入代码库进行编译,利用clang提供的相关扩展接口完成API序列信息的提取;然后对API序列进行预处理,将相同的API序列合并成一条序列及将嵌套使用的序列进行关联处理;然后将预处理好的API序列存储到数据库中;然后计算数据库中API序列间的距离,得到距离矩阵;然后根据API序列间的距离矩阵,使用DBScan聚类算法对API序列进行聚类处理,将聚类结果存储到数据库中;最后用户输入函数片段信息,利用数据库查询技术将符合要求的API序列及对应的使用代码片段返回给用户。

【技术实现步骤摘要】

基于C/C++语言的软件开发人员对API使用都基于手工查找和搜索引擎查找,要找到真正需要的内容十分困难,现在的代码搜索技术虽然可以找到API使用相关的代码,但通过这种方式可以找到的代码片段非常多,逐一分析也很费时。本方法就是基于C/C++代码库的API调用模式的挖掘方法,应用在软件开发领域,提高软件开发效率。
技术介绍
对于技术开发公司来说,每个公司都有自己的代码库,并且是海量的。海量的数据库对于技术开发公司来说是个资源,公司又怎么利用该资源呢?技术开发人员要利用开放的接口-API(Application Programming Interface)完成特定的功能,一种特定的功能对应着一条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:int A(int,int)->int B(int,int),序列S2:int A(int,int)->int B(int,int),序列S3:int A(int,double)->int B(int,int),S1与S2序列相同,则S1与S2只记录一个序列信息并且将序列次数记录为2,S3序列与S2因为参数类型不同则不做合并处理;(22)将具有镶嵌关系进行展开处理,如主方法中序列为A、B、C,另外方法C为D、E,将序列A B C与序列D E关联成一条序列A B D E。作为优选,所述步骤(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/C++代码库的API调用模式挖掘方法,其特征在于,如下步骤:步骤(1)、clang编译C/C++代码库,提取代码API序列信息;步骤(2)、对API序列信息预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列;步骤(3)、API序列数据库存储,将预处理后的API序列中的函数统一编号后,对函数及其参数类型信息进行存储,后将API序列函数名转化为编号后存储;步骤(4)、计算API序列距离矩阵;步骤(5)、利用距离矩阵,使用DBScan算法,将API序列进行聚类处理;步骤(6)、用户查询数据库,将匹配的API序列及对应代码片段返回给用户。

【技术特征摘要】
1.一种基于C/C++代码库的API调用模式挖掘方法,其特征在于,如下步骤:步骤(1)、clang编译C/C++代码库,提取代码API序列信息;步骤(2)、对API序列信息预处理,将相同的API序列合并成一条序列,将嵌套使用的多条API序列关联成一条序列;步骤(3)、API序列数据库存储,将预处理后的API序列中的函数统一编号后,对函数及其参数类型信息进行存储,后将API序列函数名转化为编号后存储;步骤(4)、计算API序列距离矩阵;步骤(5)、利用距离矩阵,使用DBScan算法,将API序列进行聚类处理;步骤(6)、用户查询数据库,将匹配的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序列函数名转化为编号后存储,步骤如下:(31)预处理后的API序列逐条处理,若当前处理的方法还未在数据库中,将方法名、所属类名、参数信息存储到方法表中,若当前处理的方法在方法表中,当前方法处理结束,方法表中主键即为该方法的编号;(32)将预处理后的序列批量插入到未聚类的API序列...

【专利技术属性】
技术研发人员:屈鸿王晓斌王留帅冯鲁桥符明晟张翮涂强
申请(专利权)人:电子科技大学
类型:发明
国别省市:四川;51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1