CN111258630B - 函数调用关系检测方法、装置、设备及存储介质 - Google Patents
函数调用关系检测方法、装置、设备及存储介质 Download PDFInfo
- Publication number
- CN111258630B CN111258630B CN201811468332.7A CN201811468332A CN111258630B CN 111258630 B CN111258630 B CN 111258630B CN 201811468332 A CN201811468332 A CN 201811468332A CN 111258630 B CN111258630 B CN 111258630B
- Authority
- CN
- China
- Prior art keywords
- function
- detected
- detection point
- call
- detection
- 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
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/443—Optimisation
-
- 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/75—Structural analysis for program understanding
-
- Y—GENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
- Y02D10/00—Energy efficient computing, e.g. low power processors, power management or thermal management
Abstract
本发明提供了一种函数调用关系检测方法、装置、设备及存储介质,用于检测待检测函数与检测点函数之间是否具有调用关系,为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目;将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。由此,对于原本直接调用待检测函数的函数,可以通过调用静态函数来调用待检测函数,并且在这一过程中,可以得到包括当前调用的返回地址和检测点函数的条目,从而可以为检测待检测函数与检测点函数之间是否具有调用关系提供实现基础。
Description
技术领域
本发明涉及函数调用,特别是涉及一种函数调用关系检测方法、装置、设备及存储介质。
背景技术
栈回溯的实现依赖于编译器的特性,与特定的平台相关,通常有两种方法,以linux内核实现的ARM栈回溯为例,通过向gcc传递-mapcs或-fununwind-tables可以选择APCS或unwind之一进行栈回溯。
使用APCS(ARMProcedureCallStandard)进行ARM栈回溯的过程中,调用标准规范了ARM寄存器的使用,函数调用时的出栈入栈规定,在栈中根据标准可以准确的进行栈回溯,但APCS中,函数的入栈和出栈对栈的消耗较大,占用的寄存器较多,而Unwind避免了此问题。Unwind将每个函数的入栈时的偏移单独保存在一个段中,在栈回溯的时候通过查表的方式查找父函数在栈中的返回地址。
APCS和Unwind是栈回溯的标准方式,但并不能解决某些特定场景下的函数调用问题。例如:1.栈回溯需要逐步进行,对于A->B->C(A中调用B函数,B中调用C函数)的情景,有时我们只关注A与C的调用关系,此时需要先从C回溯到B,再回溯到A,对于多级调用或递归调用效率相对较低。2.两种方式均依赖于编译器,在某些情境下只需要对特定函数进行栈回溯,在编译期间很难只针对部分函数进行优化。3.APCS需要通过符号表确定函数的起始地址,Unwind通过ARM.unwind_idx确定函数的起始地址,二者均是通过LR所在的函数地址范围确定其父函数,同一函数内的子函数在做调用路径检测时会产生歧义,需要针对不同函数单独处理。4.Unwind方式会在内核保存所有函数的首地址,存在极大的安全隐患,APCS若配置了符号表也存在同样的问题。
发明内容
本发明的一个目的在于提供一种函数调用关系检测方案,以解决上述至少一种问题。
根据本发明的第一个方面,提供了一种函数调用关系检测方法,用于检测待检测函数与检测点函数之间是否具有调用关系,包括:为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目;将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。
可选地,该方法还包括:对待检测函数进行重命名,以标识待检测函数。
可选地,该方法还包括:响应于检测点函数被调用,保存与检测点函数对应的标记。
可选地,该方法还包括:响应于检测点函数被调用后返回,清除与检测点函数对应的标记。
可选地,该方法还包括:在待检测函数中添加检测模块,检测模块用于响应于待检测函数被调用,检测待检测函数与检测点函数之间是否存在调用关系。
可选地,检测待检测函数与检测点函数之间是否存在调用关系的步骤包括:根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数;在查找到检测点函数的情况下,检查是否存在与检测点函数对应的标记。
可选地,该方法还包括:在检测到存在与检测点函数对应的标记的情况下,判定待检测函数与检测点函数存在调用关系。
根据本发明的第二个方面,还提供了一种函数调用关系检测方法,包括:获取编译期间生成的条目,条目包括返回地址和检测点函数,其中,条目是在与待检测函数对应的静态函数被调用时生成的,通过调用静态函数,来调用待检测函数;根据待检测函数被调用时的返回地址,从与返回地址对应的条目中查找检测点函数;基于查找结果,判断待检测函数是否与检测点函数存在调用关系。
可选地,基于查找结果判断待检测函数是否与检测点函数存在调用关系的步骤包括:在查找到检测点函数的情况下,检测是否存在与检测点函数对应的标记;在检测到存在与检测点函数对应的标记的情况下,判定待检测函数与检测点函数存在调用关系。
根据本发明的第三个方面,还提供了一种函数调用关系检测装置,包括:添加模块,用于为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目;和调用调整模块,用于将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。
可选地,该装置还包括:命名模块,用于对所述待检测函数进行重命名,以标识所述待检测函数。
可选地,该装置还包括:保存模块,用于响应于所述检测点函数被调用,保存与所述检测点函数对应的标记。
可选地,该装置还包括:清除模块,用于响应于所述检测点函数被调用后返回,清除与所述检测点函数对应的标记。
可选地,该装置还包括:检测模块,用于响应于所述待检测函数被调用,检测所述待检测函数与所述检测点函数之间是否存在调用关系。
可选地,检测模块包括:查找模块,用于根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数;和检查模块,用于在查找到所述检测点函数的情况下,检查是否存在与所述检测点函数对应的标记。
可选地,在检测到存在与所述检测点函数对应的标记的情况下,检测模块判定所述待检测函数与所述检测点函数存在调用关系。
根据本发明的第四个方面,还提供了一种函数调用关系检测装置,包括:获取模块,用于获取编译期间生成的条目,条目包括返回地址和检测点函数,其中,条目是在与待检测函数对应的静态函数被调用时生成的,通过调用静态函数,来调用待检测函数;查找模块,用于根据待检测函数被调用时的返回地址,从与返回地址对应的条目中查找检测点函数;以及判断模块,用于基于查找结果,判断待检测函数是否与检测点函数存在调用关系。
可选地,在查找到所述检测点函数的情况下,判断模块还检测是否存在与所述检测点函数对应的标记,在检测到存在与所述检测点函数对应的标记的情况下,判定所述待检测函数与所述检测点函数存在调用关系。
根据本发明的第五个方面,还提供了一种计算设备,包括:处理器;以及存储器,其上存储有可执行代码,当可执行代码被处理器执行时,使处理器执行如本发明第一个方面或第二个方面述及的方法。
根据本发明的第六个方面,还提供了一种非暂时性机器可读存储介质,其上存储有可执行代码,当可执行代码被电子设备的处理器执行时,使处理器执行如本发明第一个方面或第二个方面述及的方法。
本发明通过对特定的待检测函数进行修改,使得待检测函数被调用时,可以得到包括当前调用的返回地址和检测点函数的条目,从而可以为检测待检测函数与检测点函数之间是否具有调用关系提供实现基础。如此,在只需要对特定的函数间是否存在调用关系进行检测的场景下,本发明只需对具体函数进行修改,就可以满足检测需求,而无需逐步回溯获取所有的中间调用关系。
附图说明
通过结合附图对本公开示例性实施方式进行更详细的描述,本公开的上述以及其它目的、特征和优势将变得更加明显,其中,在本公开示例性实施方式中,相同的参考标号通常代表相同部件。
图1是示出了根据本发明一实施例的函数调用关系检测方法的示意性流程图。
图2是示出了根据本发明另一实施例的函数调用关系检测方法的示意性流程图。
图3是示出了根据本发明一实施例的检测流程示意图。
图4是示出了根据本发明一实施例的函数调用关系检测装置的结构的示意性方框图。
图5是示出了根据本发明另一实施例的函数调用关系检测装置的结构的示意性方框图。
图6示出了根据本发明一实施例可用于实现上述函数调用关系检测方法的计算设备的结构示意图。
具体实施方式
下面将参照附图更详细地描述本公开的优选实施方式。虽然附图中显示了本公开的优选实施方式,然而应该理解,可以以各种形式实现本公开而不应被这里阐述的实施方式所限制。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
【术语解释】
调用路径:函数的调用路径是当前函数栈回溯中所有函数的集合。
栈回溯:栈中保存着函数的返回地址、局部变量等,栈回溯即是用于从这些返回地址来确定函数的调用关系、调用顺序。
待检测函数:需要检测其函数调用关系的函数。
检测点函数:需要检测是否与待检测函数存在调用关系的函数。
返回地址:函数调用结束后下一条执行语句的地址。
【方案概述】
本发明提出了一种函数调用关系检测方案,用于检测待检测函数是否与检测点函数存在调用关系,也即检测待检测函数是否在检测点函数的调用路径上。
本发明通过对待检测函数进行修改,使得待检测函数被调用时,可以得到包括当前调用的返回地址和检测点函数的条目。例如,可以为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目,并且将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。由此,对于原本直接调用待检测函数的函数,可以通过调用静态函数来调用待检测函数,并且在这一过程中,可以得到包括当前调用的返回地址和检测点函数的条目。
对于检测点函数,则可以在其被调用时,保存与检测点函数对应的标记。如此,在待检测函数被调用时,可以基于当前调用的返回地址,从条目中查找是否存在检测点函数,并在查找到存在检测点函数的情况下,进一步查找是否存在与检测点函数对应的标记,以确定待检测函数与检测点函数之间是否存在调用关系,即待检测函数是否在检测点函数的调用路径上。
本发明的函数调用关系检测方案可以用于检测特定函数在某个返回地址与检测点函数之间是否存在调用关系,与APCS/Unwind相比,更加轻量级,同时相对更加安全。例如,对于A->B->C这一调用关系而言,在只需要对函数A和函数C间是否存在调用关系进行检测时,本发明只需对函数C进行修改,就可以满足检测需求,而无需逐步回溯获取所有的中间调用关系。
作为示例,本发明可以用于对关键函数(特别是内核中的关键函数)的调用路径的检测,虽然需要对待检测函数逐项处理,但由于在内核中关键函数的数量可控,因此本发明也具有较好的实性,同时避免前面提到APCS、UNWIND带来的问题。
下面就本发明涉及的各方面做进一步说明。
【函数调用关系检测方法】
图1是示出了根据本发明一实施例的函数调用关系检测方法的示意性流程图。
参见图1,在步骤S110,为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目。
静态函数被调用时生成的条目中的当前调用的返回地址,也即待检测函数被调用时的返回地址。条目中的检测点函数可以是检测点函数的地址,如可以是检测点函数的首地址。
在步骤S120,将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。
通过为待检测函数添加静态函数,并将调用待检测函数的动作修改为调用静态函数,使得原本直接调用待检测函数的函数,可以通过调用静态函数,来调用待检测函数。例如,假设待检测函数C存在如下调用关系:A->B->C,为待检测函数C添加的静态函数表示为E,那么执行步骤S120后的逻辑调用关系为:A->B->E->C。静态函数可以视为待检测函数的内联函数,根据内联函数的特性,实际存在的调用关系仍为A->B->C,只是调用过程中会生成包括返回地址和检测点函数的条目。其中,静态函数E被调用时生成的条目中的返回地址,即为待检测函数C被调用时的返回地址。
本发明还可以对待检测函数进行重命名,以标识待检测函数,如可以在执行步骤S110之前,对待检测函数进行重命名。例如,可以基于一定的命名规则,对待检测函数进行重命名,如此可以便于检测待检测函数的调用关系,如可以便于在编译期间发现所有对待检测函数的调用。
对于检测点函数,可以响应于检测点函数被调用,保存与检测点函数对应的标记。对于标记的存储位置,本发明不做限定,如可以保存在当前进程栈或进程结构体中。并且,响应于检测点函数被调用后返回,可以清除与检测点函数对应的标记,以不影响下一次检测。其中,在检测点函数是内核中的函数的情况下,还可以在系统调用返回时,清除标记。
如果检测点函数的调用路径包括待检测函数,那么在检测点函数被调用的过程中,待检测函数也会被调用,而检测点函数被调用时,会生成与检测点函数对应的标记,待检测函数被调用时,会生成包括当前调用的返回地址和检测点函数的条目。因此,可以响应于待检测函数被调用,检测对应的条目中是否存在检测点函数,并进一步检测是否存在与条目中的检测点函数对应的标记,如此根据检测结果,可以判断待检测函数与检测点函数之间是否存在函数调用关系。
基于上述分析,本发明提出,可以在待检测函数中添加检测模块,可选地,检测模块可以以函数的形式插入在待检测函数中。检测模块可以用于响应于待检测函数被调用,检测待检测函数与检测点函数之间是否存在调用关系。具体地,响应于待检测函数被调用,检测模块可以根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数,在查找到检测点函数的情况下,可以进一步检查是否存在与检测点函数对应的标记,在检测到存在与检测点函数对应的标记的情况下,可以判定待检测函数与检测点函数存在调用关系,即待检测函数在检测点函数的函数调用路径上,并且可以判定待检测函数在某个返回地址与检测点函数具有调用关系。
至此,结合图1就本发明的函数调用关系检测方案的实现流程做了说明。其中,图1所示的方法可以在程序编译期间执行,即可以在程序编译期间,检测函数间的调用关系。在程序编译期间执行本发明的函数调用关系检测方案时,本发明中述及的函数被调用是指被编译器使用以对其进行编译。例如,假设待检测函数C存在如下调用关系:A->B->C,当编译器开始对函数A编译时,则认为函数A被调用,当对函数A进行编译的过程中,需要调用函数B,以对函数B进行编译时,则认为函数B被调用。
图2是示出了根据本发明另一实施例的函数调用关系检测方法的示意性流程图。
参见图2,在步骤S210,获取编译期间生成的条目,条目包括返回地址和检测点函数。其中,条目是在与待检测函数对应的静态函数被调用时生成的,关于静态函数的描述,可以参见上文相关描述,此处不再赘述。
在步骤S220,根据待检测函数被调用时的返回地址,从与返回地址对应的条目中查找检测点函数。
如果所有的条目中没有与待检测函数被调用时的返回地址对应的条目,则可以判定待检测函数与检测点函数不存在调用关系。
在步骤S230,基于查找结果,判断待检测函数是否与检测点函数存在调用关系。
在查找到与待检测函数被调用时的返回地址对应的条目的情况下,可以进一步检测是否存在与查找到的条目中的检测点函数对应的标记,在检测到存在与检测点函数对应的标记的情况下,可以判定待检测函数与检测点函数存在调用关系。
【具体应用例】
假设函数C存在如下调用关系:A->B->C;A->D->C,检测目的为检测函数C是否与函数A具有调用关系,则可以将函数C称为待检测函数,将函数A称为检测点函数。
修改操作
首先可以执行如下修改操作,以便于后续判断检测函数C是否与函数A具有调用关系提供实现基础。
1、首先可以通过宏处理命令将函数C重命名为__btf_C,以便于编译期间发现所有对函数C的调用。
假设函数C的定义为:
int C(int*p);
重命名后的__btf_C定义为:
#define BACKTRACE_FUNCTION(x)__btf_##x
int BACKTRACE_FUNCTION(C)(int*p)
其中,关于函数各部分字段的具体定义,此处不再赘述。如此,修改后将不存在C函数,而是被重命名为__btf_C。
2、可以通过宏定义为__btf_C函数添加两处静态函数:__btf_C_AB和__btf_C_AD,可以分别表示为:
BACKTRACECALL_DEFINE1(int,C,AB,int*,p)
BACKTRACECALL_DEFINE1(int,C,AD,int*,p)
静态函数可以被设定为,对静态函数的调用会在系统生成新的条目,该条目可以称为__k_bttab,条目内容为当前调用的返回地址和检测点函数(如可以是输入的检测点函数地址)。
关于静态函数的具体定义,可以根据实际情况设定,此处不再赘述。
3、可以通过宏定义修改B/D函数中C函数的调用,如下:
在函数B中的调用由C(p)修改为BACKTRACECALL(C,AB,p)
在函数D中的调用由C(p)修改为BACKTRACECALL(C,AD,p)
修改后系统中存在以下逻辑调用关系:
1)A->B->__btf_C_AB->__btf_C
2)A->B->__btf_C_AD->__btf_C
而由于内联函数的特性,系统中实际存在的调用关系为:
1)A->B->__btf_C
2)A->D->__btf_C
同时此两处调用会在系统增加两个__k_bttab段条目,分别为:
{__btf_C函数在函数B中的返回地址__btf_C_LRB,函数A的地址}
{__btf_C函数在函数D中的返回地址__btf_C_LRD,函数A的地址}
4、在函数A中做标记,表示当前函数A被调用
在函数A调用时可以添加与函数A对应的标记,表示函数A被调用到,标记的结果可以记录在不同位置,如当前进程栈或进程结构体中。
5、可以在函数__btf_C中添加检测函数,检测函数可以表示为BT_CHECK(),检测函数可以用于响应于函数__btf_C被调用,检测函数__btf_C是否与函数A存在调用关系,检测机制可以参见上文描述,此处不再赘述。其中,关于检测函数的具体定义,可以根据实际情况设定,此处不再赘述。
检测流程
图3是示出了根据本发明一实施例的检测流程示意图。
可以通过vmlinux.ld.S脚本获取编译期间生成的所有__k_bttab段条目,然后可以对所有__k_bttab条目进行排序,以便于后续查找,如可以在系统初始化阶段对所有__k_bttab条目进行排序。其中,可以根据__k_bttab条目中的返回地址进行排序。
在函数A被调用时,可以在进程栈或进程结构体中添加函数A被调用的标记(标记A),在函数A调用返回时,可以清除进程栈或进程结构体中的函数标记A,为下一次检测做准备。另外在函数__btf_C被调用时,可以通过函数__btf_C内的检测函数(BT_CHECK函数)检查其调用路径。
作为示例,BT_CHECK具体检测操作为:根据当前函数返回地址在__k_bttab表中精确查找返回地址对应的检测点函数,若无检测点函数,则检测失败。若存在检测点函数,则进一步检查进程栈或进程结构体中是否存在检测点函数A的标记,若存在标记,则栈回溯检测成功。
如图3所示,在函数B通过调用静态函数__btf_C_AB(图中未示出)调用_btf_C函数时,当前返回地址为返回地址1,返回地址1可以表示为__btf_C_LRB,在函数D通过调用静态函数__btf_C_AD(图中未示出)调用_btf_C函数时,当前返回地址为返回地址2,返回地址2可以表示为__btf_C_LRD。响应于_btf_C函数被调用,__k_bttab表中可以记录返回地址1和函数A、返回地址2和函数A。可以通过设置在_btf_C函数中的检测函数,根从__k_bttab表中查找与当前返回地址对应的检测点函数A,然后再从保存的标记中查找是否存在检测点函数A的标记,在查找到检测点函数A的标记的情况下,表明检测点函数A与函数C之间存在调用关系,且可以进一步判定函数B、D均在检测点函数A的调用路径上。
与现有的栈回溯方案相比,本发明至少可以产生如下技术效果:
1.栈回溯需要逐步进行,对于A->B->C(A中调用B函数,B中调用C函数)的情景,有时我们只关注A与C的调用关系,此时需要先从C回溯到B,再回溯到A,对于多级调用或递归调用效率相对较低。本方案中适用于对内核关键函数的检测,可以指定要检测函数C在某点(某个返回地址)与函数A的调用关系。2.两种方式均依赖于编译器,在某些情境下只需要对特定函数进行栈回溯,在编译期间很难只针对部分函数进行优化。本发明是针对具体函数实施的,可以只针对需要进行栈回溯的关键函数进行编译优化。3.APCS需要通过符号表确定函数的起始地址,Unwind通过ARM.unwind_idx确定函数的起始地址,二者均是通过LR(连接寄存器)所在的函数地址范围确定其父函数,同一函数内的子函数在做调用路径检测时会产生歧义,需要针对不同函数单独处理。本发明可以精确匹配到具体返回地址,针对不同的返回地址,可指定不同的匹配函数,不会产生歧义。4.Unwind方式会在内核保存所有函数的首地址,存在极大的安全隐患,APCS若配置了符号表也存在同样的问题。本发明可以只在内核中保存使用到的函数的首地址,缓解了以上方式带来的安全隐患。
【函数调用关系检测装置】
本发明还可以实现为一种函数调用关系检测装置。其中,函数调用关系检测装置的功能模块可以由实现本发明原理的硬件、软件或硬件和软件的结合来实现。本领域技术人员可以理解的是,图4所描述的功能模块可以组合起来或者划分成子模块,从而实现上述发明的原理。因此,本文的描述可以支持对本文描述的功能模块的任何可能的组合、或者划分、或者更进一步的限定。
函数调用关系检测装置可以具有的功能模块以及各功能模块可以执行的操作做简要说明,对于其中涉及的细节部分可以参见上文描述,这里不再赘述。
图4是示出了根据本发明一实施例的函数调用关系检测装置的结构的示意性方框图。
参见图4,函数调用关系检测装置400包括添加模块410和调用调整模块420。
添加模块410用于为待检测函数添加静态函数,静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目。调用调整模块420用于将调用待检测函数的动作修改为调用静态函数,以由静态函数调用待检测函数。
在本发明的一个实施例中,函数调用关系检测装置400还可以可选地包括图中虚线框所示的命名模块430,命名模块43用于对待检测函数进行重命名,以标识待检测函数。
在本发明的一个实施例中,函数调用关系检测装置400还可以可选地包括图中虚线框所示的保存模块440,保存模块440用于响应于检测点函数被调用,保存与检测点函数对应的标记。
在本发明的一个实施例中,函数调用关系检测装置400还可以可选地包括图中虚线框所示的清除模块450,清除模块450用于响应于检测点函数被调用后返回,清除与检测点函数对应的标记。
在本发明的一个实施例中,函数调用关系检测装置400还可以可选地包括图中虚线框所示的检测模块460,用于响应于待检测函数被调用,检测待检测函数与检测点函数之间是否存在调用关系。可选地,检测模块460可以包括查找模块和检查模块(图中未示出)。查找模块用于根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数,检查模块用于在查找到检测点函数的情况下,检查是否存在与检测点函数对应的标记。可选地,在检测到存在与检测点函数对应的标记的情况下,检测模块可以判定待检测函数与检测点函数存在调用关系。
图5是示出了根据本发明另一实施例的函数调用关系检测装置的结构的示意性方框图。
参见图5,函数调用关系检测装置500包括获取模块510、查找模块520和判断模块530。获取模块510用于获取编译期间生成的条目,条目包括返回地址和检测点函数,其中,条目是在与待检测函数对应的静态函数被调用时生成的,通过调用静态函数,来调用待检测函数。查找模块520用于根据待检测函数被调用时的返回地址,从与返回地址对应的条目中查找检测点函数。判断模块530用于基于查找结果,判断待检测函数是否与检测点函数存在调用关系。
可选地,在查找到所述检测点函数的情况下,判断模块530还检测是否存在与所述检测点函数对应的标记,在检测到存在与所述检测点函数对应的标记的情况下,判定所述待检测函数与所述检测点函数存在调用关系。
【计算设备】
图6示出了根据本发明一实施例可用于实现上述函数调用关系检测方法的计算设备的结构示意图。
参见图6,计算设备600包括存储器610和处理器620。
处理器620可以是一个多核的处理器,也可以包含多个处理器。在一些实施例中,处理器620可以包含一个通用的主处理器以及一个或多个特殊的协处理器,例如图形处理器(GPU)、数字信号处理器(DSP)等等。在一些实施例中,处理器620可以使用定制的电路实现,例如特定用途集成电路(ASIC,Application Specific Integrated Circuit)或者现场可编程逻辑门阵列(FPGA,Field Programmable Gate Arrays)。
存储器610可以包括各种类型的存储单元,例如系统内存、只读存储器(ROM),和永久存储装置。其中,ROM可以存储处理器620或者计算机的其他模块需要的静态数据或者指令。永久存储装置可以是可读写的存储装置。永久存储装置可以是即使计算机断电后也不会失去存储的指令和数据的非易失性存储设备。在一些实施方式中,永久性存储装置采用大容量存储装置(例如磁或光盘、闪存)作为永久存储装置。另外一些实施方式中,永久性存储装置可以是可移除的存储设备(例如软盘、光驱)。系统内存可以是可读写存储设备或者易失性可读写存储设备,例如动态随机访问内存。系统内存可以存储一些或者所有处理器在运行时需要的指令和数据。此外,存储器610可以包括任意计算机可读存储媒介的组合,包括各种类型的半导体存储芯片(DRAM,SRAM,SDRAM,闪存,可编程只读存储器),磁盘和/或光盘也可以采用。在一些实施方式中,存储器610可以包括可读和/或写的可移除的存储设备,例如激光唱片(CD)、只读数字多功能光盘(例如DVD-ROM,双层DVD-ROM)、只读蓝光光盘、超密度光盘、闪存卡(例如SD卡、min SD卡、Micro-SD卡等等)、磁性软盘等等。计算机可读存储媒介不包含载波和通过无线或有线传输的瞬间电子信号。
存储器610上存储有可执行代码,当可执行代码被处理器620处理时,可以使处理器620执行上文述及的函数调用关系检测方法。
上文中已经参考附图详细描述了根据本发明的函数调用关系检测方法、装置及设备。
此外,根据本发明的方法还可以实现为一种计算机程序或计算机程序产品,该计算机程序或计算机程序产品包括用于执行本发明的上述方法中限定的上述各步骤的计算机程序代码指令。
或者,本发明还可以实施为一种非暂时性机器可读存储介质(或计算机可读存储介质、或机器可读存储介质),其上存储有可执行代码(或计算机程序、或计算机指令代码),当所述可执行代码(或计算机程序、或计算机指令代码)被电子设备(或计算设备、服务器等)的处理器执行时,使所述处理器执行根据本发明的上述方法的各个步骤。
本领域技术人员还将明白的是,结合这里的公开所描述的各种示例性逻辑块、模块、电路和算法步骤可以被实现为电子硬件、计算机软件或两者的组合。
附图中的流程图和框图显示了根据本发明的多个实施例的系统和方法的可能实现的体系架构、功能和操作。在这点上,流程图或框图中的每个方框可以代表一个模块、程序段或代码的一部分,所述模块、程序段或代码的一部分包含一个或多个用于实现规定的逻辑功能的可执行指令。也应当注意,在有些作为替换的实现中,方框中所标记的功能也可以以不同于附图中所标记的顺序发生。例如,两个连续的方框实际上可以基本并行地执行,它们有时也可以按相反的顺序执行,这依所涉及的功能而定。也要注意的是,框图和/或流程图中的每个方框、以及框图和/或流程图中的方框的组合,可以用执行规定的功能或操作的专用的基于硬件的系统来实现,或者可以用专用硬件与计算机指令的组合来实现。
以上已经描述了本发明的各实施例,上述说明是示例性的,并非穷尽性的,并且也不限于所披露的各实施例。在不偏离所说明的各实施例的范围和精神的情况下,对于本技术领域的普通技术人员来说许多修改和变更都是显而易见的。本文中所用术语的选择,旨在最好地解释各实施例的原理、实际应用或对市场中的技术的改进,或者使本技术领域的其它普通技术人员能理解本文披露的各实施例。
Claims (9)
1.一种函数调用关系检测方法,用于检测待检测函数与检测点函数之间是否具有调用关系,其特征在于,包括:
为待检测函数添加静态函数,所述静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目;
将调用所述待检测函数的动作修改为调用所述静态函数,以由所述静态函数调用所述待检测函数;
所述方法还包括:
响应于所述检测点函数被调用,保存与所述检测点函数对应的标记;
在所述待检测函数中添加检测模块,所述检测模块用于响应于所述待检测函数被调用,检测所述待检测函数与所述检测点函数之间是否存在调用关系;
根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数;
在查找到所述检测点函数的情况下,检查是否存在与所述检测点函数对应的标记。
2.根据权利要求1所述的函数调用关系检测方法,其特征在于,还包括:
对所述待检测函数进行重命名,以标识所述待检测函数。
3.根据权利要求1所述的函数调用关系检测方法,其特征在于,还包括:
响应于所述检测点函数被调用后返回,清除与所述检测点函数对应的标记。
4.根据权利要求3所述的函数调用关系检测方法,其特征在于,还包括:
在检测到存在与所述检测点函数对应的标记的情况下,判定所述待检测函数与所述检测点函数存在调用关系。
5.一种函数调用关系检测方法,其特征在于,包括:
获取编译期间生成的条目,所述条目包括返回地址和检测点函数,其中,所述条目是在与待检测函数对应的静态函数被调用时生成的,通过调用所述静态函数,来调用所述待检测函数;
根据所述待检测函数被调用时的返回地址,从与所述返回地址对应的所述条目中查找检测点函数;
基于查找结果,判断所述待检测函数是否与所述检测点函数存在调用关系;
所述基于查找结果,判断所述待检测函数是否与所述检测点函数存在调用关系的步骤包括:
在查找到所述检测点函数的情况下,检测是否存在与所述检测点函数对应的标记;
在检测到存在与所述检测点函数对应的标记的情况下,判定所述待检测函数与所述检测点函数存在调用关系。
6.一种函数调用关系检测装置,其特征在于,包括:
添加模块,用于为待检测函数添加静态函数,所述静态函数定义为被调用时,生成包括当前调用的返回地址和检测点函数的条目;和
调用调整模块,用于将调用所述待检测函数的动作修改为调用所述静态函数,以由所述静态函数调用所述待检测函数;
所述装置还包括:
保存模块,用于响应于所述检测点函数被调用,保存与所述检测点函数对应的标记;
检测模块,用于响应于所述待检测函数被调用,检测所述待检测函数与所述检测点函数之间是否存在调用关系;
查找模块,用于根据当前调用的返回地址,在与当前调用的返回地址对应的条目中查找检测点函数;
检查模块,用于在查找到所述检测点函数的情况下,检查是否存在与所述检测点函数对应的标记。
7.一种函数调用关系检测装置,其特征在于,包括:
获取模块,用于获取编译期间生成的条目,所述条目包括返回地址和检测点函数,其中,所述条目是在与待检测函数对应的静态函数被调用时生成的,通过调用所述静态函数,来调用所述待检测函数;
查找模块,用于根据所述待检测函数被调用时的返回地址,从与所述返回地址对应的所述条目中查找检测点函数;以及
判断模块,用于基于查找结果,判断所述待检测函数是否与所述检测点函数存在调用关系;
所述基于查找结果,判断所述待检测函数是否与所述检测点函数存在调用关系包括:
在查找到所述检测点函数的情况下,检测是否存在与所述检测点函数对应的标记;
在检测到存在与所述检测点函数对应的标记的情况下,判定所述待检测函数与所述检测点函数存在调用关系。
8.一种计算设备,包括:
处理器;以及
存储器,其上存储有可执行代码,当所述可执行代码被所述处理器执行时,使所述处理器执行如权利要求1-5中任何一项所述的方法。
9.一种非暂时性机器可读存储介质,其上存储有可执行代码,当所述可执行代码被电子设备的处理器执行时,使所述处理器执行如权利要求1至5中任一项所述的方法。
Priority Applications (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811468332.7A CN111258630B (zh) | 2018-12-03 | 2018-12-03 | 函数调用关系检测方法、装置、设备及存储介质 |
TW108129777A TW202022603A (zh) | 2018-12-03 | 2019-08-21 | 函數呼叫關係檢測方法、裝置、設備及儲存媒體 |
PCT/CN2019/122370 WO2020114347A1 (zh) | 2018-12-03 | 2019-12-02 | 函数调用关系检测方法、装置、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201811468332.7A CN111258630B (zh) | 2018-12-03 | 2018-12-03 | 函数调用关系检测方法、装置、设备及存储介质 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN111258630A CN111258630A (zh) | 2020-06-09 |
CN111258630B true CN111258630B (zh) | 2023-05-30 |
Family
ID=70946623
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201811468332.7A Active CN111258630B (zh) | 2018-12-03 | 2018-12-03 | 函数调用关系检测方法、装置、设备及存储介质 |
Country Status (3)
Country | Link |
---|---|
CN (1) | CN111258630B (zh) |
TW (1) | TW202022603A (zh) |
WO (1) | WO2020114347A1 (zh) |
Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101122881A (zh) * | 2007-09-20 | 2008-02-13 | 福建星网锐捷网络有限公司 | 一种基于mips架构cpu的异常点定位诊断方法 |
CN103019787A (zh) * | 2012-12-14 | 2013-04-03 | 华为技术有限公司 | 函数调用关系确定方法、热补丁升级方法及装置 |
CN103761089A (zh) * | 2014-01-14 | 2014-04-30 | 清华大学 | 基于寄存器传输语言确定动态函数调用关系的方法 |
US9250881B1 (en) * | 2014-09-30 | 2016-02-02 | International Business Machines Corporation | Selection of an entry point of a function having multiple entry points |
CN105468508A (zh) * | 2014-09-04 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8621439B2 (en) * | 2011-09-06 | 2013-12-31 | Microsoft Corporation | Modern application tracing |
CN103970659B (zh) * | 2014-05-16 | 2017-01-18 | 刘玉光 | 基于插桩技术的安卓应用软件自动化测试方法 |
-
2018
- 2018-12-03 CN CN201811468332.7A patent/CN111258630B/zh active Active
-
2019
- 2019-08-21 TW TW108129777A patent/TW202022603A/zh unknown
- 2019-12-02 WO PCT/CN2019/122370 patent/WO2020114347A1/zh active Application Filing
Patent Citations (5)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101122881A (zh) * | 2007-09-20 | 2008-02-13 | 福建星网锐捷网络有限公司 | 一种基于mips架构cpu的异常点定位诊断方法 |
CN103019787A (zh) * | 2012-12-14 | 2013-04-03 | 华为技术有限公司 | 函数调用关系确定方法、热补丁升级方法及装置 |
CN103761089A (zh) * | 2014-01-14 | 2014-04-30 | 清华大学 | 基于寄存器传输语言确定动态函数调用关系的方法 |
CN105468508A (zh) * | 2014-09-04 | 2016-04-06 | 阿里巴巴集团控股有限公司 | 代码检测方法及装置 |
US9250881B1 (en) * | 2014-09-30 | 2016-02-02 | International Business Machines Corporation | Selection of an entry point of a function having multiple entry points |
Non-Patent Citations (1)
Title |
---|
向勇 ; 曹睿东 ; 毛英明 ; .基于QEMU的动态函数调用跟踪.计算机研究与发展.2017,(07),全文. * |
Also Published As
Publication number | Publication date |
---|---|
CN111258630A (zh) | 2020-06-09 |
WO2020114347A1 (zh) | 2020-06-11 |
TW202022603A (zh) | 2020-06-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US10019240B2 (en) | Method and apparatus for detecting code change | |
KR101979329B1 (ko) | 바이너리의 취약점을 유발하는 입력데이터 위치 추적 방법 및 그 장치 | |
CN103559123A (zh) | 基于VxWorks操作系统的函数调用栈分析方法及装置 | |
US9471583B2 (en) | Data race analysis with improved detection filtering | |
CN112100072A (zh) | 应用程序代码的静态检测方法、装置、设备及介质 | |
CN105760292A (zh) | 一种用于单元测试的断言验证方法和装置 | |
CN110287696A (zh) | 一种反弹shell进程的检测方法、装置和设备 | |
CN111027054A (zh) | 基于安卓系统判断应用程序在多开环境中运行方法、系统 | |
US20060114132A1 (en) | Apparatus, system, and method of dynamic binary translation with translation reuse | |
US11288171B2 (en) | Data verification apparatus, method and medium for determining whether referring parts of source code are executed | |
CN111949513A (zh) | 一种配置文件加载方法、装置、电子设备和可读存储装置 | |
CN106201859A (zh) | 一种回归测试方法及系统 | |
CN113157477B (zh) | 内存泄漏的归因方法、装置、电子设备和存储介质 | |
CN111258630B (zh) | 函数调用关系检测方法、装置、设备及存储介质 | |
US8966455B2 (en) | Flow analysis in program execution | |
CN111240987A (zh) | 移植程序检测方法、装置、电子设备及计算机可读存储介质 | |
CN114386045B (zh) | 一种Web应用程序漏洞检测方法、装置及存储介质 | |
CN114817047A (zh) | 编译器测试方法、用例生成方法及装置、指令存储结构 | |
CN110458393B (zh) | 一种风险识别方案的确定方法、装置及电子设备 | |
CN116088863B (zh) | 故障定位方法及系统 | |
US8359456B2 (en) | Generating random addresses for verification of distributed computerized devices | |
CN111241841B (zh) | 语义分析方法及装置、计算设备及可读介质 | |
CN113220334B (zh) | 程序故障定位方法、终端设备及计算机可读存储介质 | |
CN117850895B (zh) | 基于引导加载程序启动设备的方法、装置及电子设备 | |
CN113448838A (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 | ||
TA01 | Transfer of patent application right |
Effective date of registration: 20201126 Address after: Room 603, 6 / F, Roche Plaza, 788 Cheung Sha Wan Road, Kowloon, China Applicant after: Zebra smart travel network (Hong Kong) Ltd. Address before: A four-storey 847 mailbox in Grand Cayman Capital Building, British Cayman Islands Applicant before: Alibaba Group Holding Ltd. |
|
TA01 | Transfer of patent application right | ||
GR01 | Patent grant | ||
GR01 | Patent grant |