CN112148392A - 一种函数调用链获取方法、装置及存储介质 - Google Patents

一种函数调用链获取方法、装置及存储介质 Download PDF

Info

Publication number
CN112148392A
CN112148392A CN201910568619.5A CN201910568619A CN112148392A CN 112148392 A CN112148392 A CN 112148392A CN 201910568619 A CN201910568619 A CN 201910568619A CN 112148392 A CN112148392 A CN 112148392A
Authority
CN
China
Prior art keywords
function
file
subfile
calling
name
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
Application number
CN201910568619.5A
Other languages
English (en)
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.)
Tencent Technology Shenzhen Co Ltd
Original Assignee
Tencent Technology Shenzhen Co Ltd
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 Tencent Technology Shenzhen Co Ltd filed Critical Tencent Technology Shenzhen Co Ltd
Priority to CN201910568619.5A priority Critical patent/CN112148392A/zh
Publication of CN112148392A publication Critical patent/CN112148392A/zh
Pending legal-status Critical Current

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural

Abstract

本申请涉及一种函数调用链获取方法、装置及存储介质,所述方法包括:获取目标文件,其中所述目标文件中包括多个子文件;调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系;将每个子文件中的所述函数调用关系分别存储到数据库中;当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。本申请可实现根据函数名称查找到该函数的函数调用链,业务接入简单且对机器性能要求低。

Description

一种函数调用链获取方法、装置及存储介质
技术领域
本申请涉及计算机技术领域,尤其涉及一种函数调用链获取方法、装置及存储介质。
背景技术
对于采用编程语言编写的项目文件,其框架都可以反应为一棵函数调用树。在分析项目之前,通过该函数调用树就可以了解项目的整体框架;在运行项目之后,能够跟踪到运行过程中的函数调用,有利于分析某些测试条件下项目的执行流程,由此可以看出,通过获取函数调用关系,能够为项目分析以及项目测试提供极大的便利。
现有技术中提出了一种通过Clang Plugin获取函数调用关系的技术方案,Clang是一个C语言、C++、Objective-C语言的轻量级编译器,Clang Plugin方案通过编写Clang插件,更改xcode工程配置,替换xcode的Clang编译器,在工程编译阶段分析抽象语法树AST拿到函数调用关系,获取函数调用链。该技术方案由于存在替换编译器以及修改配置的操作,编译稳定性差,并且业务接入复杂,对机器的性能要求高。
发明内容
本申请所要解决的技术问题在于,提供一种函数调用链获取方法、装置及存储介质,能够通过分析得出目标文件中各子文件中的函数调用关系并存储到数据库中,从而可实现根据函数名称查找到该函数的函数调用链。
为了解决上述技术问题,本申请提供了一种函数调用链获取方法,所述方法包括:
获取目标文件,其中所述目标文件中包括多个子文件;
调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系;
将每个子文件中的所述函数调用关系分别存储到数据库中;
当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
本申请实施例还提供了一种函数调用链获取装置,所述装置包括:
文件获取模块,用于获取目标文件,其中所述目标文件中包括多个子文件;
文件分析模块,用于调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系;
调用关系存储模块,用于将每个子文件中的所述函数调用关系分别存储到数据库中;
查找模块,用于当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
本申请实施例还提供了一种计算机存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行如上述的函数调用链获取方法。
本申请实施例还提供了一种设备,所述设备包括处理器和存储器,所述存储器中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、所述至少一段程序、所述代码集或指令集由所述处理器加载并执行以实现如上述的函数调用链获取方法。
本申请通过调用预设的函数匹配工具,对获取的目标文件中的多个子文件分别进行分析,得到每个子文件的函数调用关系;将每个子文件中的函数调用关系分别存储到数据库中;当接收到函数调用链查询请求时,根据但查询函数的函数名称在所述数据库中查找待查询函数在所述目标文件中的函数调用链。本申请能够实现对于目标文件中的任一函数,根据该函数的函数名,就可以在数据库中查找到该函数在目标文件中的函数调用链;本申请在进行函数调用链获取时,无需编译、分析耗时短、业务接入简单且对机器性能要求低。
附图说明
图1是本申请实施例提供的应用场景示意图;
图2是本申请实施例提供的一种函数调用链获取方法流程图;
图3是本申请实施例提供的一种文件分析方法流程图;
图4是本申请实施例提供的一种函数调用关系存储方法流程图;
图5是本申请实施例提供的一种函数调用链查找方法流程图;
图6是本申请实施例提供的一种函数匹配工具的获取方法流程图;
图7是本申请实施例提供的一种函数调用组合的确定方法流程图;
图8是本申请实施例提供的一种函数匹配工具生成方法流程图;
图9是本申请实施例提供的第一示例示意图;
图10是本申请实施例提供的第二示例示意图;
图11是本申请实施例提供的函数调用链获取装置示意图;
图12是本申请实施例提供的函数匹配工具生成模块示意图;
图13是本申请实施例提供的第一分析模块示意图;
图14是本申请实施例提供的第一生成模块示意图;
图15是本申请实施例提供的文件分析模块示意图;
图16是本申请实施例提供的调用关系存储模块示意图;
图17是本申请实施例提供的查找模块示意图;
图18是本申请实施例提供的一种设备结构示意图。
具体实施方式
为使本申请的目的、技术方案和优点更加清楚,下面将结合附图对本申请作进一步地详细描述。显然,所描述的实施例仅仅是本申请的一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本申请保护的范围。
首先对本申请实施例中涉及到的相关名词做以下解释:
Clang:Clang(发音为/
Figure BDA0002110349390000041
/类似英文单字)是一个C、C++、Objective-C和Objective-C++编程语言的编译器前端。
Objective-C:是一种通用、高级、面向对象的编程语言。
AST:抽象语法树,是源代码语法结构的一种抽象表示。
ASTMatcher:Clang提供的一个工具,允许用户编写一个程序来匹配AST节点并能通过访问节点的C++接口来获取该AST节点的属性、源位置等任何信息,其主要由宏与模板驱动,用法和函数式编程类似,其可实现简单精准高效的匹配。
clang-query:clang提供的一个工具,快速验证ASTMatcher的正确性。
请参见图1,其示出了本申请实施例提供的应用场景示意图,该场景可以包括:用户端110、服务器120以及数据库130,其中,所述用户端110与服务器120之间可进行通信,所述服务器120与所述数据库130之间可进行通信。
其中,所述用户端110可向所述服务器120发送相关工程项目文件,所述服务器120接收到文件之后,对该文件进行分析,得到其中的函数调用关系,并将各项函数调用关系存储到数据库130中。
当用户端110向服务器120发出函数调用链查询请求时,服务器根据待查询函数的函数名在数据库130中查到该函数的函数调用链。
具体地,用户端110可以包括智能手机、台式电脑、平板电脑、笔记本电脑、数字助理等类型的实体设备,也可以包括运行于实体设备中的软体。本申请实施例中用户端110上运行的操作系统可以包括但不限于安卓系统、IOS系统、linux、windows等。
服务器120与所述用户端110以及数据库130可以通过有线或者无线建立通信连接,该服务器120可以包括一个独立运行的服务器,或者分布式服务器,或者由多个服务器组成的服务器集群,其中服务器可以是云端服务器。
请参见图2,其示出了本申请实施例提供的一种函数调用链获取方法流程图,所述方法包括:
S210.获取目标文件,其中所述目标文件中包括多个子文件。
本实施例中的目标文件可以是指工程文件或者项目文件之类的文件,该类文件一般是由多个程序子文件构成。
S220.调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系。
这里的函数匹配工具是根据预设的规则,以及相应的功能需求生成的,在本实施例中,函数匹配工具是用来对某个程序文件进行分析,从而得到该程序文件中的函数调用关系。
具体地,可参见图3,其示出了一种文件分析方法,包括:
S310.对于每个子文件,调用所述函数匹配工具,匹配出所述子文件中的一项或多项函数调用关系。
每个子文件中,可能存在多个函数,这多个函数又存在调用其他函数的情况,这里的每一项函数调用关系可以只包括一个函数调用,如A函数调用了B函数,这就可以看成是一项函数调用,A函数调用了C函数又可以看成是另一项函数调用,从而,对于一个子文件可能会分析出一项或多项函数调用关系。
S320.将每项函数调用关系分别输出到与所述子文件对应的函数匹配文件中,其中所述匹配文件中的一条记录对应一项函数调用关系,每项函数调用关系包括:目标函数的类名、目标函数的函数名以及被所述目标函数调用的被调用函数名。
对于分析出的函数调用关系可以输入到相应的函数匹配文件中进行记录,以便于查阅及展示。具体可以按不同的函数关系项进行记录,例如上述的A函数调用B函数为一项记录,A函数调用C函数为另一项记录,并且每项记录中都会包括:目标函数的类名、目标函数的函数名以及被所述目标函数调用的被调用函数名,对于A函数调用B函数的记录,其目标函数的类名为A函数的类名,目标函数的函数名为A函数的函数名,被调用函数名为B函数的函数名。
另外,在对各子文件进行分析时,可能会存在这样一种情况,即当前分析的子文件存在导入了其他文件的情况,对于和当前分析的子文件不在同一目录下的被导入文件,函数匹配工具是分析不到的,此时需要告诉函数匹配工具被导入的文件来自哪里,不然会报找不到对应头文件的错误,而且对应的函数调用也不会被分析到。本实施例中,可以将被导入文件的文件目录通过预设参数传递给所述函数匹配工具。
S230.将每个子文件中的所述函数调用关系分别存储到数据库中。
上述步骤是对各子文件分别进行分析,从而得到与各子文件相对应的函数匹配文件,对于单独的函数匹配文件,只能够获知一个文件中的函数调用关系,所以需要将各函数匹配文件中的函数调用关系存储到数据库中,这样就可以查到整个目标文件中的各函数的函数调用关系,具体地,可参见图4,其示出了一种函数调用关系存储方法,包括:
S410.当在所述函数匹配文件中查找到具有相同的所述目标函数的函数名的至少两项函数调用关系项时,确定所述至少两项函数调用关系项为组合关系项。
对各函数匹配文件进行汇总分析,对于相关的函数调用关系项可以进行组合。具体地,这里具有相同的目标函数的函数名的函数调用关系项可以理解为是同一目标函数调用了不同的函数,例如上述举例中的A函数调用B函数项,A函数调用C函数项,这两项函数调用关系便可组成一个关于A函数的组合关系项。当然,若是函数匹配文件中还存在A函数调用了除B函数和C函数以外的其他函数的函数调用关系时,将该项函数调用关系加入到上述的关于A函数的组合关系项中。
S420.将所述组合关系项中的所述函数调用关系项以一条记录的形式存储到所述数据库中。
具体地,关于A函数的函数调用关系可以被记录为A函数→B函数#C函数。
S240.当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
当目标文件中的所有函数调用关系都被存储到数据库之后,对于目标文件中的任一函数均可通过数据库查找到该函数的函数调用关系链。具体可参见图5,其示出了一种函数调用链查找方法,可以包括:
S510.根据当前待查询函数的函数名称,在所述数据库中查找调用所述当前待查询函数的上层函数。
S520.判断是否存在调用所述当前待查询函数的上层函数。
S530.当存在所述上层函数时,记录所述上层函数名称,并确定所述上层函数为当前待查询函数,重复查找判断步骤。
S540.当不存在所述上层函数时,结束函数查找。
通过以上函数调用链查找方法,对于待查询函数,均可获取到与该函数对应的函数调用链,即待查询函数被哪些函数所调用。需要说明的是,对于同一待查询函数,与其对应的函数调用链可能不止一条,这是因为可能有多个函数直接调用了待查询函数,而这些函数又分别被其他函数调用,由此形成了多条函数调用链。
另外,通过数据库除了能够查到待查询函数被哪些函数所调用,也可以查到待查询函数调用了哪些函数,其查找过程与图5所示的方法类似,找的是被当前待查询函数调用的函数。具体如何应用,可根据实施需求进行操作。
本申请主要是通过函数匹配工具来对各子文件进行分析,从而得到个子文件中的函数调用关系,具体地函数匹配工具的获取方法可参见图6,所述方法包括:
S610.获取模板文件。
这里的模板文件可以是存在函数调用的程序文件,之所以要存在函数调用是因为本申请中就是针对要实现分析函数调用功能的,若是要实现其他的功能,可要求模板文件中存在于其他功能相对应的特定要素。
S620.对所述模板文件进行分析,得到所述模板文件中的函数调用组合。
具体地,所述函数调用组合的确定方法可参见图7,包括:
S710.获取所述模板文件的语法树。
这里的语法树可通过对模板文件执行预设的命令所得到的,通过得到的语法树可得到模板文件的代码结构。
S720.从所述语法树中确定被调用函数节点。
S730.从所述语法树中确定所述被调用函数节点上一层的函数定义节点。
这里的上一层的函数定义节点所对应的函数调用步骤S720中被调用函数节点所对应的函数。
S740.从所述语法树中确定所述函数定义节点的类声明节点。
这里的类声明节点所对应的类是所述函数定义节点对应的函数的类。
S750.组合所述被调用函数节点、所述函数定义节点以及所述类声明节点,得到所述函数调用组合。
S630.根据所述函数调用组合生成所述函数匹配工具。
请参见图8,其示出了一种函数匹配工具生成方法,所述方法包括:
S810.根据所述函数调用组合创建匹配器。
S820.基于所述匹配器以及预设规则,编写匹配函数。
S830.对所述匹配函数进行编译,生成所述函数匹配工具。
本实施例上述的每项函数调用关系包括:目标函数的类名、目标函数的函数名以及被所述目标函数调用的被调用函数名,其中目标函数的类名、目标函数的函数名以及被调用函数名分别对应类声明节点、函数定义节点以及被调用函数节点。由此也可以看出,函数匹配工具对每个文件分析的过程其实就是用预设的规则在被分析的文件中进行匹配的过程。
本申请能够实现对于目标文件中的任一函数,根据该函数的函数名,就可以在数据库中查找到该函数在目标文件中的函数调用链;本申请在进行函数调用链获取时,无需编译、分析耗时短、业务接入简单且对机器性能要求低。
本申请可应用于相关软件或者应用的系统测试阶段,具体可以包括如下步骤:
1、获取版本间的代码函数差异。
2、根据代码函数差异,通过本方案,获取每个差异函数的函数调用。
3、结合函数对应的模块关系,准确的推荐出对应模块下的功能测试用例。
例如,在项目开发过程中,修改了其中的A函数,其直接影响了拍照功能,于是可以验证拍照功能;但A函数改变了影响了调用A的B函数,间接影响到了视频通话功能,但在不知道修改A函数会影响B函数的情况下,没有验证到视频通话功能。通过获取函数调用链,得知A函数的改变影响到了B函数,这样就会去验证B函数所对应的视频通话的功能,保证了软件的质量。这样准确、精细的质量控制方法,避免了盲目的测试,提高了测试效率。
为了清楚地说明本申请的具体实施过程,下面以一具体实例来说明。
1.根据模板文件,得到与模板文件对应的语法树。
模板文件demoB.m文件内容如下:
Figure BDA0002110349390000091
通过clang-Xclang-ast-dump-fsyntax-only demoB.m命令,得到demoB.m文件的语法树,其中包括如下三类节点信息:
ObjCImplementationDecl Ox7fad98593678</Users/addbin/www/CYHTest/get_func_link/demoB.m:4:1,line:13:1>line:4:17Bus
ObjCFlethodDecl Ox7fad98593710<line:6:1,line:12:1>line:6:1-drive'void'
ObjCMessageExpr Ox7fad98593db0<col:16,col:33>'Car*'selector=init
ObjCMessageExpr Ox7fad98593d80<col:17,col:27>'Car*'selector=allocclass='Car'
2.创建匹配器
创建匹配器的策略如下:
寻找想匹配的节点的最外层的类;在AST Matcher Reference中查看所需要的Matcher匹配到需要的节点;创建外部匹配表达式,验证它是否按预期运行。
具体地,对demoB.m文件的语法树进行分析,可以先拿到ObjCMessageExpr节点;拿到函数调用后,获取ObjCMessageExpr节点的上一层:所在函数定义ObjCMethodDecl,最后得到ObjCMethodDecl节点上一层:所在类的声明ObjCImplementationDecl。
根据上述步骤,需要的函数调用的组合Matcher可以为:
objcMessageExpr(hasAncestor(objcMethodDecl(hasAncestor(objcImplementationDecl()))))
通过以下代码进行clang-query验证:
match objcMessageExpr(hasAncestor(objcMethodDecl(hasAncestor(objcImplementationDecl()))))
得到clang-query匹配结果如下:
Figure BDA0002110349390000101
Figure BDA0002110349390000111
为了后续获取匹配到的结果,一般会对匹配器进行绑定,只需要在匹配器中调用bind()方法:
match objcMessageExpr(hasAnCestor(objcMethodDecl(hasAnCestor(objcImplementationDecl().bind("myClass"))).bind("mySelector"))).bind("funcCaller")
clang-query验证匹配表达式没问题后,就可以写ASTMatcher了:
DeclarationMatcher FuncLinWlatcher=objcMethodDecl(hasAnCestor(objcImplementationDecl().bind("myClass")),forEechDescendant(objcMessageExpr().bind("funcCaller"))).bind("mySelector");
3.编写匹配函数
根据ASTMatcher匹配规则,匹配函数编写如下:
class Fun_Call:public MatchFinder::MatchCallback{
public:
virtual void run(const MatchFinder::MatchResult&Result)
{
ObjCMethodDecl const*methodDecl=Result.Nodes.getNodeAs<ObjCMethodDecl>("mySelector");
Cout<<"begin============="<<"\n"
//输出类名
const ObjClmplementation*classDecl=Result.Nodes.getNodeAs<ObjCImplementationDecl>("myClass");
std::string implementationName=classDecl->getIdentifier()->getName();
cout<<implementationName<<"::";
//输出函数名
if(methodDecl->isInstanceMethod())
{
std::string methodName=(methodDecl->getSelector()).getAsString();
cout<<"-"<<methodName<<endl;
}
else if(methodDecl->isClassMethod())
{
std::string methodName=(methodDecl->getSelector()).getAsString();
cout<<"+"<<methodName<<endl;
}
//输出文件路径
cout<<"Path:"<<rootPath<<endl;
//输出被调用函数
const ObjCMessageExpr*funcCaller=Result.Nodes.getNodeAs<ObjCMessageExpr>("funcCaller");
std::string selector=(funcCaller->getSelector()).getAsString();
std::string className;
if(funcCaller->isInstanceMessage())
{
className=funcCaller->getInstance Receiver()->getType().getAsString();
}
else if(funcCaller->is ClassMessage())
{
className=funcCaller->getClassReceiver().getAsString();
}
cout<<"["<<className;
cout<<""<<selector<<"]"<<endl;
cout<<"end==============="<<endl<<endl<<endl
}
};
4.编写main函数
根据ClangASTMatchermain函数编写规则,main()如下:
int main(int argc,const char**argv){
CommonOptionsParser OptionsParser(argc,argv,MyTooICategory);
ClangTool Tool(OptionsParser.getCompilations(),OptionsParser.getSourcePathList());
Func_Call FuncCall;
MatchFinder Finder;
Finder.addMatcher(FuncLinkMatcher,&FuncCall);
Return Tool.run(newFrontendActionFactory(&Finder).get());
}
Clang环境就绪后,使用ninja构建,对应build/bin目录就会生成对应的可执行文件。
5.使用ASTMatcher
被分析的模板文件中若导入import了其他文件,ASTMatcher是分析不到的,这时需要告诉ASTMatcherimport的文件来自哪里,所以被分析文件import的文件的目录需要通过参数-I传给ASTMatcher(同目录的文件引用不用-I传参),不然会报找不到对应头文件的错误,而且对应的函数调用不会被分析到。
例如:A.m import了B.m,并且A.m中又使用B.m中的函数,那么在使用ASTMatcher分析A.m文件中的函数调用关系时,若不通过-l将B.m文件位置传参,则ASTMatcher分析不出A.m调用B.m文件中函数的关系,使用举例:
/Users/addbin/clang-llvm/build/bin/func-call
/Users/addbin/www/CYHTest/get_func_link/demoB.m---I
/Users/addbin/www/CYHTest/get_func_link1/
上述距离中第一行是生成的可执行文件,第二行是被分析的文件,第三行是被import的文件所在的目录路径,由于被分析的文件与被import的文件不在同一目录下,需要通过参数-I进行传参。
执行上述三行命令之后,结果如下:
begin=============
Bus::-drive
Path:/Users/addbin/www/CYHTest/get_func_link/demoB.m
[Car*init]
end===============
begin=============
Bus::-drive
Path:/Users/addbin/www/CYHTest/get_func_lin k/demoB.m
[Car alloc]
end===============
begin=============
Bus::-drive
Path:/Use rs/addbin/www/CYHTest/get_func_lin k/demoB.m
[Car*setCarName:]
end===============
begin=============
Bus::-drive
Path:/Users/addbin/www/CYHTest/get_func_lin k/demoB.m
[Car*setCarType:]
end===============
上述结果是与demoB.m对应的函数匹配txt文件,从该文件中可以看出,demoB.m文件中存在四项函数调用关系,其均是由dirve函数调用其他的函数,并且dirve函数对应的类为Bus。目标函数的类名Bus、目标函数的函数名drive以及被所述目标函数调用的被调用函数名,均与上述创建ASTMatcher过程中从语法树中确定节点对应的类声明节点、函数定义节点以及被调用函数节点对应,由此也可以看出,ASTMatcher对每个文件分析的过程其实就是用预设的规则在被分析的文件中进行匹配的过程。
6.使用ClangASTMatcher分析工程文件
通过上述生成的ClangASTMatcher,对工程文件中的每个子文件进行分析得到函数匹配txt文件,其分析结果请参见图9,以其中一个子文件AACDecoder.m为例,其中有一项函数调用关系是:目标函数的类为AACDecoder,目标函数的函数名为pcmdata,被函数pcmdata调用的函数为MSMutableData new;从而可以得到该工程文件中所有子文件中的函数调用关系。
在得到各子文件的函数匹配txt文件之后,将其中的函数调用关系存储到数据库中,对于函数调用关系中目标函数的函数名相同的情况,可存储为一条记录,被该目标函数调用的多个函数可通过相关符号进行连接,具体请参见图10,图10以列表的形式显示出函数的调用关系,其中Class_name为类,Func_name为目标函数,My_callee为被目标函数调用的函数,在My_callee这一列可以看到,被同一目标函数调用的多个函数通过“#”进行连接,记录在与目标函数对应的行中。如果要获取一个函数的调用关系,需要对整个数据库进行一轮查询,得到一个数据结构为树的数据,例如:一行数据为2->3->4,另一行数据为5->2,再另外一行数据为9->5,查询函数9的调用关系时,那么9的调用链为9->5->2->3->4。
本申请通过Clang分析源代码文件,在分析过程中会生成信息完整的抽象语法树;基于Clang ASTMatcher,编写出对应的匹配器,并在其内部嵌套多个ASTMatcher,构造一个ASTMatchers的树,来分析代码的AST,准确快速的匹配到想要的节点,获取函数之间的调用关系。
本申请相比于现有的通过ClangPlugin获取函数调用关系的方案,无需替换xcode编译器,无需修改xcode工程配置,无语法问题;摆脱了xcode,无需编译,分析耗时短;业务接入简单,接入成本低,只需提供代码读权限;对机器性能要求很低。
请参见图11,其示出了一种函数调用链获取装置,所述装置包括:
文件获取模块1110,用于获取目标文件,其中所述目标文件中包括多个子文件。
文件分析模块1120,用于调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系。
调用关系存储模块1130,用于将每个子文件中的所述函数调用关系分别存储到数据库中。
查找模块1140,用于当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
其中,其参见图12,所述装置还包括函数匹配工具生成模块,其包括:
第一获取模块1210,用于获取模板文件;
第一分析模块1220,用于对所述模板文件进行分析,得到所述模板文件中的函数调用组合;
第一生成模块1230,用于根据所述函数调用组合生成所述函数匹配工具。
具体地,请参见图13,所述第一分析模块1220包括:
语法树获取模块1310,用于获取所述模板文件的语法树。
第一确定节点1320,用于从所述语法树中确定被调用函数节点。
第二确定模块1330,用于从所述语法树中确定所述被调用函数节点上一层的函数定义节点。
第三确定模块1340,用于从所述语法树中确定所述函数定义节点的类声明节点。
组合模块1350,用于组合所述被调用函数节点、所述函数定义节点以及所述类声明节点,得到所述函数调用组合。
请参见图14,所述第一生成模块1230包括:
匹配器创建模块1410,用于根据所述函数调用组合创建匹配器。
匹配函数生成模块1420,用于基于所述匹配器以及预设规则,编写匹配函数。
编译模块1430,用于对所述匹配函数进行编译,生成所述函数匹配工具。
请参见图15,所述文件分析模块1120包括:
匹配模块1510,用于对于每个子文件,调用所述函数匹配工具,匹配出所述子文件中的一项或多项函数调用关系。
匹配文件生成模块1520,用于将每项函数调用关系分别输出到与所述子文件对应的函数匹配文件中,其中所述匹配文件中的一条记录对应一项函数调用关系,每项函数调用关系包括:目标函数的类名、目标函数的函数名以及被所述目标函数调用的被调用函数名。
请参见图16,所述调用关系存储模块1130包括:
组合关系项确定模块1610,用于当在所述函数匹配文件中查找到具有相同的所述目标函数的函数名的至少两项函数调用关系项时,确定所述至少两项函数调用关系项为组合关系项。
第一存储模块1620,用于将所述组合关系项中的所述函数调用关系项以一条记录的形式存储到所述数据库中。
请参见图17,所述查找模块1140包括:
第一判断模块1710,用于根据当前待查询函数的函数名称,在所述数据库中查找调用所述当前待查询函数的上层函数,判断是否存在调用所述当前待查询函数的上层函数。
第四确定模块1720,用于当存在所述上层函数时,记录所述上层函数名称,并确定所述上层函数为当前待查询函数。
重复模块1730,用于重复上述查找判断步骤,直至所述数据库中不存在调用所述当前待查询函数调用的上层函数。
另外,所述文件分析模块1120还包括:
参数传递模块,用于在对每个子文件进行分析时,当所述子文件存在导入文件的情况时,将被导入文件的文件目录通过预设参数传递给所述函数匹配工具。
上述实施例中提供的装置可执行本申请任意实施例所提供方法,具备执行该方法相应的功能模块和有益效果。未在上述实施例中详尽描述的技术细节,可参见本申请任意实施例所提供的方法。
本实施例还提供了一种计算机可读存储介质,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行本实施例中的任一方法。
本实施例还提供了一种设备,其结构图请参见图18,该设备1800可因配置或性能不同而产生比较大的差异,可以包括一个或一个以上中央处理器(central processingunits,CPU)1822(例如,一个或一个以上处理器)和存储器1832,一个或一个以上存储应用程序1842或数据1844的存储介质1830(例如一个或一个以上海量存储设备)。其中,存储器1832和存储介质1830可以是短暂存储或持久存储。存储在存储介质1830的程序可以包括一个或一个以上模块(图示未示出),每个模块可以包括对设备中的一系列指令操作。更进一步地,中央处理器1822可以设置为与存储介质1830通信,在设备1800上执行存储介质1830中的一系列指令操作。设备1800还可以包括一个或一个以上电源1826,一个或一个以上有线或无线网络接口1850,一个或一个以上输入输出接口1858,和/或,一个或一个以上操作系统1841,例如Windows ServerTM,Mac OS XTM,UnixTM,LinuxTM,FreeBSDTM等等。本实施例上述的任一方法均可基于图18所示的设备进行实施。
本说明书提供了如实施例或流程图所述的方法操作步骤,但基于常规或者无创造性的劳动可以包括更多或者更少的操作步骤。实施例中列举的步骤和顺序仅仅为众多步骤执行顺序中的一种方式,不代表唯一的执行顺序。在实际中的系统或中断产品执行时,可以按照实施例或者附图所示的方法顺序执行或者并行执行(例如并行处理器或者多线程处理的环境)。
本实施例中所示出的结构,仅仅是与本申请方案相关的部分结构,并不构成对本申请方案所应用于其上的设备的限定,具体的设备可以包括比示出的更多或更少的部件,或者组合某些部件,或者具有不同的部件的布置。应当理解到,本实施例中所揭露的方法、装置等,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述模块的划分仅仅为一种逻辑功能的划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元模块的间接耦合或通信连接。
基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的全部或部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
本领域技术人员还可以进一步意识到,结合本说明书所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但这种实现不应认为超出本申请的范围。
以上所述,以上实施例仅用以说明本申请的技术方案,而非对其限制;尽管参照前述实施例对本申请进行了详细的说明,本领域的普通技术人员应当理解:其依然可以对前述各实施例所记载的技术方案进行修改,或者对其中部分技术特征进行等同替换;而这些修改或者替换,并不使相应技术方案的本质脱离本申请各实施例技术方案的精神和范围。

Claims (10)

1.一种函数调用链获取方法,其特征在于,包括:
获取目标文件,其中所述目标文件中包括多个子文件;
调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系;
将每个子文件中的所述函数调用关系分别存储到数据库中;
当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
2.根据权利要求1所述的一种函数调用链获取方法,其特征在于,所述函数调用链获取方法还包括所述函数匹配工具的生成方法,所述函数匹配工具的生成方法包括:
获取模板文件;
对所述模板文件进行分析,得到所述模板文件中的函数调用组合;
根据所述函数调用组合生成所述函数匹配工具。
3.根据权利要求2所述的一种函数调用链获取方法,其特征在于,所述对所述模板文件进行分析,得到所述模板文件中的函数调用组合包括:
获取所述模板文件的语法树;
从所述语法树中确定被调用函数节点;
从所述语法树中确定所述被调用函数节点上一层的函数定义节点;
从所述语法树中确定所述函数定义节点的类声明节点;
组合所述被调用函数节点、所述函数定义节点以及所述类声明节点,得到所述函数调用组合。
4.根据权利要求2所述的一种函数调用链获取方法,其特征在于,所述根据所述函数调用组合生成函数匹配工具包括:
根据所述函数调用组合创建匹配器;
基于所述匹配器以及预设规则,编写匹配函数;
对所述匹配函数进行编译,生成所述函数匹配工具。
5.根据权利要求1所述的一种函数调用链获取方法,其特征在于,所述调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系包括:
对于每个子文件,调用所述函数匹配工具,匹配出所述子文件中的一项或多项函数调用关系;
将每项函数调用关系分别输出到与所述子文件对应的函数匹配文件中,其中所述匹配文件中的一条记录对应一项函数调用关系,每项函数调用关系包括:目标函数的类名、目标函数的函数名以及被所述目标函数调用的被调用函数名。
6.根据权利要求5所述的一种函数调用链获取方法,其特征在于,所述将每个子文件中的所述函数调用关系分别存储到数据库中包括:
当在所述函数匹配文件中查找到具有相同的所述目标函数的函数名的至少两项函数调用关系项时,确定所述至少两项函数调用关系项为组合关系项;
将所述组合关系项中的所述函数调用关系项以一条记录的形式存储到所述数据库中。
7.根据权利要求6所述的一种函数调用链获取方法,其特征在于,所述当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链包括:
根据当前待查询函数的函数名称,在所述数据库中查找调用所述当前待查询函数的上层函数,判断是否存在调用所述当前待查询函数的上层函数;
当存在所述上层函数时,记录所述上层函数名称,并确定所述上层函数为当前待查询函数;
重复上述查找判断步骤,直至所述数据库中不存在调用所述当前待查询函数调用的上层函数。
8.根据权利要求1所述的一种函数调用链获取方法,其特征在于,所述调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数关系包括:
在对每个子文件进行分析时,当所述子文件存在导入文件的情况时,将被导入文件的文件目录通过预设参数传递给所述函数匹配工具。
9.一种函数调用链获取装置,其特征在于,包括:
文件获取模块,用于获取目标文件,其中所述目标文件中包括多个子文件;
文件分析模块,用于调用预设的函数匹配工具,对每个子文件进行分析,得到每个子文件中的函数调用关系;
调用关系存储模块,用于将每个子文件中的所述函数调用关系分别存储到数据库中;
查找模块,用于当接收到函数调用链查询请求时,所述查询请求中包括待查询函数的函数名称,根据所述函数名称在所述数据库中查找所述待查询函数在所述目标文件中的函数调用链。
10.一种计算机存储介质,其特征在于,所述存储介质中存储有至少一条指令、至少一段程序、代码集或指令集,所述至少一条指令、至少一段程序、代码集或指令集由处理器加载并执行如权利要求1至8任一项所述的函数调用链获取方法。
CN201910568619.5A 2019-06-27 2019-06-27 一种函数调用链获取方法、装置及存储介质 Pending CN112148392A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201910568619.5A CN112148392A (zh) 2019-06-27 2019-06-27 一种函数调用链获取方法、装置及存储介质

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201910568619.5A CN112148392A (zh) 2019-06-27 2019-06-27 一种函数调用链获取方法、装置及存储介质

Publications (1)

Publication Number Publication Date
CN112148392A true CN112148392A (zh) 2020-12-29

Family

ID=73870025

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201910568619.5A Pending CN112148392A (zh) 2019-06-27 2019-06-27 一种函数调用链获取方法、装置及存储介质

Country Status (1)

Country Link
CN (1) CN112148392A (zh)

Cited By (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113360407A (zh) * 2021-07-02 2021-09-07 北京百度网讯科技有限公司 函数的定位方法、装置、电子设备及可读存储介质
CN116069338A (zh) * 2023-03-07 2023-05-05 深圳开源互联网安全技术有限公司 一种函数库引用检测方法、装置、设备及可读存储介质

Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020111945A1 (en) * 2000-12-15 2002-08-15 Young William J. System for interfacing an application program with diverse databases
US20110099564A1 (en) * 2009-10-26 2011-04-28 Hong Fu Jin Precision Industry (Shenzhen) Co., Ltd. Program calling system and method
CN103425565A (zh) * 2012-05-16 2013-12-04 腾讯科技(深圳)有限公司 获取程序运行信息的方法及系统
US20140289705A1 (en) * 2012-12-24 2014-09-25 Tencent Technology (Shenzhen) Company Limited Systems and Methods for Generating Function-Relation Call Trees
CN104699503A (zh) * 2015-02-28 2015-06-10 深圳市同洲电子股份有限公司 一种替换安卓系统中函数的执行逻辑的方法及装置
CN106970820A (zh) * 2017-04-26 2017-07-21 腾讯科技(深圳)有限公司 代码存储方法及代码存储装置
CN107102944A (zh) * 2017-04-07 2017-08-29 北京深思数盾科技股份有限公司 一种调用函数的分析方法及装置
CN109542942A (zh) * 2018-11-28 2019-03-29 网易(杭州)网络有限公司 函数调用的查询方法及装置、电子设备
WO2019071898A1 (zh) * 2017-10-09 2019-04-18 平安科技(深圳)有限公司 电子装置、数据库查询脚本生成方法及存储介质

Patent Citations (9)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20020111945A1 (en) * 2000-12-15 2002-08-15 Young William J. System for interfacing an application program with diverse databases
US20110099564A1 (en) * 2009-10-26 2011-04-28 Hong Fu Jin Precision Industry (Shenzhen) Co., Ltd. Program calling system and method
CN103425565A (zh) * 2012-05-16 2013-12-04 腾讯科技(深圳)有限公司 获取程序运行信息的方法及系统
US20140289705A1 (en) * 2012-12-24 2014-09-25 Tencent Technology (Shenzhen) Company Limited Systems and Methods for Generating Function-Relation Call Trees
CN104699503A (zh) * 2015-02-28 2015-06-10 深圳市同洲电子股份有限公司 一种替换安卓系统中函数的执行逻辑的方法及装置
CN107102944A (zh) * 2017-04-07 2017-08-29 北京深思数盾科技股份有限公司 一种调用函数的分析方法及装置
CN106970820A (zh) * 2017-04-26 2017-07-21 腾讯科技(深圳)有限公司 代码存储方法及代码存储装置
WO2019071898A1 (zh) * 2017-10-09 2019-04-18 平安科技(深圳)有限公司 电子装置、数据库查询脚本生成方法及存储介质
CN109542942A (zh) * 2018-11-28 2019-03-29 网易(杭州)网络有限公司 函数调用的查询方法及装置、电子设备

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
贾荻等: "基于数据库的在线函数调用图工具", 小型微型计算机系统, no. 03, 15 March 2016 (2016-03-15) *

Cited By (4)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113360407A (zh) * 2021-07-02 2021-09-07 北京百度网讯科技有限公司 函数的定位方法、装置、电子设备及可读存储介质
CN113360407B (zh) * 2021-07-02 2023-10-13 北京百度网讯科技有限公司 函数的定位方法、装置、电子设备及可读存储介质
CN116069338A (zh) * 2023-03-07 2023-05-05 深圳开源互联网安全技术有限公司 一种函数库引用检测方法、装置、设备及可读存储介质
CN116069338B (zh) * 2023-03-07 2023-08-11 深圳开源互联网安全技术有限公司 一种函数库引用检测方法、装置、设备及可读存储介质

Similar Documents

Publication Publication Date Title
Cummins et al. Synthesizing benchmarks for predictive modeling
JP7317722B2 (ja) ブロックチェーンコンパイラ
CN111209005B (zh) 程序文件的编译方法、装置和计算机可读存储介质
CN106909510A (zh) 一种获取测试用例的方法以及服务器
CN113283613B (zh) 深度学习模型的生成方法、优化方法、装置、设备及介质
WO2014011696A1 (en) Method and system for automated improvement of parallelism in program compilation
WO2017095720A1 (en) Techniques to identify idiomatic code in a code base
CN101866315B (zh) 软件开发工具的测试方法及系统
CN111931181B (zh) 基于图挖掘的软件逻辑漏洞检测方法
US10521209B2 (en) Machine-based normalization of machine instructions
CN112148392A (zh) 一种函数调用链获取方法、装置及存储介质
US10853041B2 (en) Extensible instrumentation
US9116714B2 (en) Methods and systems for file processing
Ford et al. Integration of the Rosetta suite with the python software stack via reproducible packaging and core programming interfaces for distributed simulation
WO2015003452A1 (en) Methods and systems for file processing
CN115994085A (zh) 代码覆盖率的测试处理方法、装置、设备及存储介质
US10642714B2 (en) Mapping dynamic analysis data to source code
Vajk et al. Runtime model validation with parallel object constraint language
US11740875B2 (en) Type inference in dynamic languages
US11573777B2 (en) Method and apparatus for enabling autonomous acceleration of dataflow AI applications
DeRose et al. Relative debugging for a highly parallel hybrid computer system
US9747085B2 (en) Source code generation from prototype source
CN117242457A (zh) 定位神经网络性能热点
Jeon et al. Collage: Seamless integration of deep learning backends with automatic placement
CN114968247A (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