CN106095443B - 一种基于c/c++代码库的api调用模式挖掘方法 - Google Patents

一种基于c/c++代码库的api调用模式挖掘方法 Download PDF

Info

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
Application number
CN201610412437.5A
Other languages
English (en)
Other versions
CN106095443A (zh
Inventor
屈鸿
王晓斌
王留帅
冯鲁桥
符明晟
张翮
涂强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
University of Electronic Science and Technology of China
Original Assignee
University of Electronic Science and Technology of China
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by University of Electronic Science and Technology of China filed Critical University of Electronic Science and Technology of China
Priority to CN201610412437.5A priority Critical patent/CN106095443B/zh
Publication of CN106095443A publication Critical patent/CN106095443A/zh
Application granted granted Critical
Publication of CN106095443B publication Critical patent/CN106095443B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/30Creation 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调用模式挖掘方法
技术领域
基于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)中得到的序列出现次数进行排序,将序列及对应代码片段输出。
CN201610412437.5A 2016-06-14 2016-06-14 一种基于c/c++代码库的api调用模式挖掘方法 Active CN106095443B (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US9104525B2 (en) * 2013-01-22 2015-08-11 Microsoft Technology Licensing, Llc API usage pattern mining

Patent Citations (2)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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