CN114328168A - 异常检测方法、装置、计算机设备和存储介质 - Google Patents
异常检测方法、装置、计算机设备和存储介质 Download PDFInfo
- Publication number
- CN114328168A CN114328168A CN202011071489.3A CN202011071489A CN114328168A CN 114328168 A CN114328168 A CN 114328168A CN 202011071489 A CN202011071489 A CN 202011071489A CN 114328168 A CN114328168 A CN 114328168A
- Authority
- CN
- China
- Prior art keywords
- function
- target
- function node
- node
- exception
- 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
Links
- 238000001514 detection method Methods 0.000 title claims abstract description 73
- 230000006870 function Effects 0.000 claims abstract description 606
- 238000000034 method Methods 0.000 claims abstract description 53
- 230000005856 abnormality Effects 0.000 claims abstract description 26
- 230000007488 abnormal function Effects 0.000 claims abstract description 10
- 230000002159 abnormal effect Effects 0.000 claims description 76
- 238000013507 mapping Methods 0.000 claims description 27
- 238000001914 filtration Methods 0.000 claims description 19
- 238000004590 computer program Methods 0.000 claims description 15
- 238000010586 diagram Methods 0.000 description 19
- 230000008569 process Effects 0.000 description 14
- 230000003068 static effect Effects 0.000 description 9
- 238000004458 analytical method Methods 0.000 description 8
- 238000004891 communication Methods 0.000 description 7
- 238000012360 testing method Methods 0.000 description 5
- 230000001960 triggered effect Effects 0.000 description 3
- 125000004122 cyclic group Chemical group 0.000 description 2
- 230000000694 effects Effects 0.000 description 2
- 238000005516 engineering process Methods 0.000 description 2
- 230000008520 organization Effects 0.000 description 2
- 238000007781 pre-processing Methods 0.000 description 2
- 241000282326 Felis catus Species 0.000 description 1
- 238000013473 artificial intelligence Methods 0.000 description 1
- 230000006399 behavior Effects 0.000 description 1
- 230000000295 complement effect Effects 0.000 description 1
- 238000010276 construction Methods 0.000 description 1
- 238000011161 development Methods 0.000 description 1
- 239000003999 initiator Substances 0.000 description 1
- 239000004973 liquid crystal related substance Substances 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 230000007246 mechanism Effects 0.000 description 1
- 238000012986 modification Methods 0.000 description 1
- 230000004048 modification Effects 0.000 description 1
- 230000003287 optical effect Effects 0.000 description 1
- 238000012545 processing Methods 0.000 description 1
- ZLIBICFPKPWGIZ-UHFFFAOYSA-N pyrimethanil Chemical compound CC1=CC(C)=NC(NC=2C=CC=CC=2)=N1 ZLIBICFPKPWGIZ-UHFFFAOYSA-N 0.000 description 1
- 230000001502 supplementing effect Effects 0.000 description 1
Images
Landscapes
- Debugging And Monitoring (AREA)
Abstract
本申请涉及一种异常检测方法、装置、计算机设备和存储介质。所述方法包括:获取对原程序文件编译所产生的目标文件;从所述目标文件中读取函数和所述函数之间的关联关系;基于所述函数和对应的所述关联关系生成函数节点关系图;在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。采用本方法能够在编译阶段对不可查异常的函数进行异常排查,以避免应用程序退出。
Description
技术领域
本申请涉及计算机技术领域,特别是涉及一种异常检测方法、装置、计算机设备和存储介质。
背景技术
当开发出一个应用程序之后,通过会对该应用程序进行测试,在测试过程中,对于可查异常(checked exceptions),编译器在编译过程中通常会对相应函数进行检查,因此需要采用捕捉(try catch)语句以进行异常捕捉;而对于不可查异常(uncheckedexceptions),编译器不会对这类异常进行检查,因此通常不采用捕捉语句对相应函数进行异常捕捉。然而,若不对不可查异常进行处理,应用程序在抛出异常之后将会被终止,对于一些特定的情境,通常不希望应用程序因这种不可查异常而退出,因此需要对可能出现不可查异常的函数进行异常排查。针对上述的问题,目前尚未提出有效的解决方案。
发明内容
基于此,有必要针对上述技术问题,提供一种能够在编译阶段对不可查异常的函数进行异常排查,以避免应用程序退出的异常检测方法、装置、计算机设备和存储介质。
一种异常检测方法,所述方法包括:
获取对原程序文件编译所产生的目标文件;
从所述目标文件中读取函数和所述函数之间的关联关系;
基于所述函数和对应的所述关联关系生成函数节点关系图;
在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
一种异常检测装置,所述装置包括:
获取模块,用于获取对原程序文件编译所产生的目标文件;
读取模块,用于从所述目标文件中读取函数和所述函数之间的关联关系;
生成模块,用于基于所述函数和对应的所述关联关系生成函数节点关系图;
查找模块,用于在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
报错模块,用于当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,所述处理器执行所述计算机程序时实现以下步骤:
获取对原程序文件编译所产生的目标文件;
从所述目标文件中读取函数和所述函数之间的关联关系;
基于所述函数和对应的所述关联关系生成函数节点关系图;
在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
一种计算机可读存储介质,其上存储有计算机程序,所述计算机程序被处理器执行时实现以下步骤:
获取对原程序文件编译所产生的目标文件;
从所述目标文件中读取函数和所述函数之间的关联关系;
基于所述函数和对应的所述关联关系生成函数节点关系图;
在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
上述异常检测方法、装置、计算机设备和存储介质,通过对原程序文件进行编译得到目标文件,根据目标文件可以读取出每个函数和函数间的关联关系,利用该函数和对应的关联关系构建函数节点关系图,以抛出异常的函数节点为起始点遍历该函数节点关系图,得到属于预设异常类型但未进行异常捕捉的目标函数节点,从而可以找出所有可能出现不可查异常但未进行异常捕捉的目标函数节点,对由该目标函数节点构成的整条调用链,即起始点至函数终节点之间的所有函数节点进行报错,实现了在编译阶段对不可查异常的函数进行异常排查;由于可以发现可能出现不可查异常但又未进行异常捕捉的情况,从而可以对原程序文件进行问题排查,进而可以有效避免应用程序因不可查异常而退出的问题。
附图说明
图1为一个实施例中异常检测方法的应用环境图;
图2为一个实施例中异常检测方法的流程示意图;
图3为一个实施例中函数节点关系图的结构示意图;
图4为一个实施例中基于异常信息集查找目标函数节点,以及进行报错步骤的流程示意图;
图5为一个实施例中进行参数配置以及进行异常检测过程的流程示意图;
图6为另一个实施例中异常检测方法的流程示意图;
图7为一个实施例中关于函数调用关系,以及是否catch异常的示意图;
图8为一个实施例中进行汇总预处理以及进行异常检测的示意图;
图9为一个实施例中异常检测装置的结构框图;
图10为另一个实施例中异常检测装置的结构框图;
图11为一个实施例中计算机设备的内部结构图。
具体实施方式
为了使本申请的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本申请进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本申请,并不用于限定本申请。
需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
在对异常检测方法进行说明之前,先对本申请实施例中的概念进行解释:
调用链:是计算机科学中的函数调用路径,比如main→function1→function2→…→current_function。
exception(异常):在计算机科学中,一般指的是程序运行过程中可能会发生的异常情况;在java类语言中,分为可查异常(checked exception)和不可查异常(uncheckedexception),可查异常在编译器会检查,这种可查异常要么被捕捉(catch),要么用抛出语句(throws)在函数参数后面声明。不可查异常属于运行时异常,编译器是不管的。
然而,但是有些情境下不希望应用程序因为这种不可查异常而退出,因此在本申请实施例中,提出了一种方法来确保不可查异常都检测出来,以便在测试之前,在原程序文件中添加相应的捕捉语句,如try catch语句。
程序静态分析:是指在不运行应用程序的条件下,进行程序分析的方法。有些程序分析需要在程序运行时才能进行,这种程序分析称为动态程序分析。大部分的静态程序分析的对象是针对特定版本的源代码,也有些静态程序分析的对象是目标代码。静态程序分析主要指配合静态程序分析工具进行的分析。
Checker:静态分析工具的组成部分,针对某一类问题,比如内存泄漏或者数组越界。
字节码:JVM(Java virtual machine,Java虚拟机)里的指令集。java/scala等语言的代码会先编译成字节码,然后交给JVM执行。其中,字节码的最小组织文件是.class文件,该.class文件属于本申请实施例中的目标文件。
FindBugs:一个开源的分析字节码的静态分析工具,提供了一些基础的能力(比如描述类/函数等程序结构的类,变量是否肯定不会是null等取值分析),同时可以自定义checker。该FindBugs即为本申请实施例中的异常分析工具,在本申请实施例中,异常检测方法可以基于FindBugs来实现。
多态(polymorphism):指为不同数据类型的实体提供统一的接口。在Java里面,这些共享接口的类型要么有共同的祖先,要么实现了同一个接口。这种机制使得调用某个函数的行为要在运行时才能确定,因为引用指向的对象的类型有多种可能,此为多态。
本申请提供的异常检测方法,可以应用于如图1所示的应用环境中。在该应用环境中,包括终端102和服务器104。该异常检测方法可以由终端102或服务器104执行,也可以由终端102和服务器104协同执行。以由终端102执行为例进行说明,终端102获取对原程序文件编译所产生的目标文件;从目标文件中读取函数和函数之间的关联关系;基于函数和对应的关联关系生成函数节点关系图;在函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;当起始点至函数终节点之间的所有函数节点均属于预设异常类型但未进行异常捕捉时,则进行报错,即将报错信息显示于终端102的显示器上。
以由终端102和服务器104协同执行为例进行说明,终端102将原程序文件上传至服务器104;服务器104对该原程序文件进行编译,得到编译所产生的目标文件;从目标文件中读取函数和函数之间的关联关系;基于函数和对应的关联关系生成函数节点关系图;在函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;当起始点至函数终节点之间的所有函数节点均属于预设异常类型但未进行异常捕捉时,将报错信息发送至终端102;终端102显示该报错信息以实现报错。
其中,终端102可以是智能手机、平板电脑、笔记本电脑、台式计算机、智能手表等,但并不局限于此。该终端102上可以安装有异常检测工具,用于执行异常检测方法。
服务器104可以是独立的物理服务器,也可以是多个物理服务器构成的服务器集群,可以是提供云服务、云数据库、云计算、云函数、云存储、网络服务、云通信、中间件服务、域名服务、安全服务、内容分发网络(Content Delivery Network,CDN)、以及大数据和人工智能平台等基础云计算服务的云服务器。该服务器104上也可以安装有异常检测工具,用于执行异常检测方法。
终端102与服务器104之间可以通过蓝牙、USB(Universal Serial Bus,通用串行总线)或者网络等通讯连接方式进行连接,本申请在此不做限制。
在一个实施例中,如图2所示,提供了一种异常检测方法,以该方法应用于图1中的终端为例进行说明,包括以下步骤:
S202,获取对原程序文件编译所产生的目标文件。
其中,原程序文件可以指利用集成开发平台进行程序开发过程中所形成的程序文件。例如,该原程序文件可以是后缀名为.java的文件,或者是其它源代码文件,如后缀名为.c++的文件。
目标文件可以指对原程序文件进行编译之后所产生的类文件。例如,该目标文件可以是后缀名为.class的文件。
在一个实施例中,终端获取原程序文件,通过编译器对原程序文件进行编译,得到编译所产生的目标文件。其中,该编译器可以是本地编译器或交叉编译器,本地编译器可以生成在与编译器本身所在的计算机和操作系统(平台)相同的环境下运行的目标代码;交叉编译器可以生成在其它平台上运行的目标代码。
S204,从目标文件中读取函数和函数之间的关联关系。
其中,该函数为计算机函数,是一个固定的一个程序段,可以实现固定的运算功能,同时还带有一个入口和一个出口,该入口即为函数的各个输入参数,该出口即为函数的函数值。该关联关系可以指函数之间存在调用关系、或复写关系,如函数1调用了函数2,则函数1和函数2之间存在关联关系。
在一个实施例中,终端在得到目标文件后,按照函数格式从该目标文件中读取函数,然后确定所读取的函数之间的关联关系。其中,函数格式通常为:函数名和括号,如function()。例如,从目标文件中读取满足函数格式要求的函数。
在另一个实施例中,也可以设置特定的函数标识,在目标文件中按照函数标识读取对应的函数,然后确定所读取的函数之间的关联关系。例如,设置需要读取的函数标识为function1()、function2()和function3(),然后在目标文件中读取与function1()、function2()和function3()匹配的函数。
在一个实施例中,S204具体可以包括:当编译器完成对原程序文件的编译时,调用异常检测工具;在目标文件中,通过异常检测工具读取函数和函数之间的关联关系。
其中,该异常检测工具中,可以设置需要关注的异常类型、需要关注的文件标识以及过滤项。该过滤项可以指哪些函数可以不需要进行异常检测,或者,当函数的输入参数为特定值时,可以无需对该输入参数下的函数进行异常检测,如某个循环函数在第i输入参数的情况下,函数值肯定不会为null,此时可以将第i输入参数下的循环函数不进行异常检测。
在一个实施例中,终端可以利用该异常检测工具对需要关注的文件标识所对应的目标文件进行函数读取,以及确定函数之间的关联关系。
S206,基于函数和对应的关联关系生成函数节点关系图。
其中,函数节点关系图(function_to_node_map)可以是以函数为节点以关联关系为边所构成的图,用于表示函数以及函数之间的关联关系。当关联关系为调用关系时,该函数节点关系图即为调用关系图。
在一个实施例中,S206具体可以包括:终端确定函数的函数标识;生成与函数对应的函数节点;将函数标识和函数节点保存于函数节点集;根据关联关系生成与函数节点集中的函数节点对应的调用边;基于调用边和函数节点集构建函数节点关系图。
其中,函数标识可以是函数的名称或用于表示该函数的标签。函数节点集可以是一个数组或字典,例如,该字典可以是function_to_node_map,终端可以将函数标识作为键,将函数节点作为值保存于function_to_node_map。
在一个实施例中,该关联关系为调用关系,终端可以根据该调用关系确定各函数所调用的函数,如函数1调用函数2,然后为存在调用关系的函数之间生成调用边,该调用边也可成为入边。
其中,调用边的一端连接调用方的函数所对应的函数节点,另一端连接被调用方的函数所对应的函数节点,如函数1调用函数2,则调用边的一端连接函数1对应的函数节点,另一端连接函数2对应的函数节点。每个函数节点可以保存对应的调用位置,即函数在目标文件的位置。
在一个实施例中,终端在获得函数和对应的关联关系之后,为每个函数生成一个函数节点,然后将该函数的函数标识和函数节点
S208,在函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点。
在一个实施例中,在所述函数节点关系图中,终端以抛出异常的函数节点为起始点,往调用抛出异常的函数节点的上层函数节点进行遍历,直至函数终节点,以在调用抛出异常的函数节点的所有上层函数节点中,查找出属于预设异常类型但未进行异常捕捉的目标函数节点。
其中,函数终节点可以指函数节点关系图中调用抛出异常的函数的源始点。例如,函数1调用函数2,函数2调用函数3,该函数3为抛出异常的函数,则函数终节点即为函数1所对应的函数节点;或者,当函数2为被函数1调用的情况下,调用了函数3,那么函数终节点也可以是函数2所对应的函数节点。
预设异常类型可以指预设的运行时异常(Runtime Exception)类及其子类异常,运行时异常的子类异常包括不可查异常(unchecked exceptions),如NullPointerException、IndexOutOfBoundsException等。
进行异常捕捉可以指采用捕捉语句对函数可能出现的异常进行捕捉,该捕捉语句可以是try catch语句,例如:
try{
//程序代码1,该程序代码中包含所调用的函数
}catch(异常类型1异常的变量名1){
//程序代码1,该程序代码中包含所调用的函数
}catch(异常类型2异常的变量名2)
作为一个示例,如图3所示,图3为函数节点关系图,若函数节点3、函数节点4和函数节点6均抛出异常、且均未捕捉异常(catch Exception),则分别以函数节点3、函数节点4和函数节点6为起始点开始进行遍历:
1)函数节点3→函数节点2→函数节点1
从抛出异常的函数节点3为起始点,往函数节点3的上一层函数节点2进行遍历,判断该函数节点2是否属于预设异常类型但未进行异常捕捉,若函数节点2未进行异常捕捉,则继续往上一层函数节点1进行遍历,判断该函数节点1是否属于预设异常类型但未进行异常捕捉;若函数节点1未进行异常捕捉,从而函数节点3→函数节点2→函数节点1这条调用链上的所有函数节点,均属于预设异常类型但未进行异常捕捉的目标函数节点,即函数节点3→函数节点2→函数节点1这条调用链均未进行异常捕捉。
2)函数节点4→函数节点2→函数节点1
从抛出异常的函数节点4为起始点,往函数节点4的上一层函数节点2进行遍历,判断该函数节点2是否属于预设异常类型但未进行异常捕捉,若函数节点2未进行异常捕捉,则继续往上一层函数节点1进行遍历,判断该函数节点1是否属于预设异常类型但未进行异常捕捉;若函数节点1未进行异常捕捉,从而查找到函数节点4→函数节点2→函数节点1这条调用链上的所有属于预设异常类型但未进行异常捕捉的目标函数节点,从而可知函数节点4→函数节点2→函数节点1这条调用链均未进行异常捕捉。
3)函数节点6→函数节点5
从抛出异常的函数节点6为起始点,往函数节点6的上一层函数节点5进行遍历,判断该函数节点5是否属于预设异常类型但未进行异常捕捉,若函数节点5进行了异常捕捉,则函数节点6→函数节点5这条调用链进行了异常捕捉。
S210,当函数节点关系图中包含基于目标函数节点组成的调用链时,则进行报错。
其中,调用链可以指:基于函数节点对应的函数之间存在调用关系所组成的链。如图3所示,函数节点1对应的函数调用了函数节点2对应的函数,函数节点2对应的函数调用了函数节点3对应的函数,因此,函数节点3→函数节点2→函数节点1构成一条调用链。同理,函数节点4→函数节点2→函数节点1构成一条调用链,函数节点6→函数节点5构成一条调用链。
由图3可知,函数节点关系图中包含有函数节点3→函数节点2→函数节点1这条调用链,若函数节点1、函数节点2和函数节点4均属于目标函数节点,即属于预设异常类型但未进行异常捕捉,则说明函数节点关系图中包含基于目标函数节点组成的调用链,则对函数节点3→函数节点2→函数节点1这条调用链进行报错。若函数节点3和函数节点1均属于预设异常类型但未进行异常捕捉的目标函数节点,但函数节点2属于预设异常类型且进行异常捕捉,则函数节点3→函数节点2→函数节点1这条调用链不是基于目标函数节点组成的调用链,此时则不对函数节点3→函数节点2→函数节点1这条调用链进行报错。
在一个实施例中,S210具体可以包括:当函数节点关系图中包含基于目标函数节点组成的调用链时,则根据生成包含调用链的报错信息;将报错信息进行输出显示。由于该报错信息包含了调用链,开发人员可以很容易的看出哪些调用链上没有进行异常捕捉,以及没有捕捉的异常类型,如没有catch哪种unchecked exception。
上述实施例中,通过对原程序文件进行编译得到目标文件,根据目标文件可以读取出每个函数和函数间的关联关系,利用该函数和对应的关联关系构建函数节点关系图,以抛出异常的函数节点为起始点遍历该函数节点关系图,得到属于预设异常类型但未进行异常捕捉的目标函数节点,从而可以找出所有可能出现不可查异常但未进行异常捕捉的目标函数节点,对由该目标函数节点构成的整条调用链(即起始点至函数终节点之间的所有函数节点)进行报错,实现了在编译阶段对不可查异常的函数进行异常排查;由于可以发现可能出现不可查异常但又未进行异常捕捉的情况,从而可以对原程序文件进行问题排查,进而可以有效避免应用程序因不可查异常而退出的问题。
在一个实施例中,如图4所示,该方法还包括:
S402,从目标文件中,读取进行了异常捕捉的第一函数和对应的第一异常信息。
其中,异常捕捉可以指采用捕捉语句捕捉函数可能出现的异常,该捕捉语句可以是try catch语句。第一异常信息可以指采用捕捉语句捕捉第一函数所出现的异常的信息,如NullPointerException异常的信息。
例如,从.class文件中读取catch异常的function1(),然后读取try catch语句中所catch的异常信息,如:
try{
//程序代码,该程序代码中包含所调用的function1()
}catch(异常类型异常的变量名)。
其中,该异常信息包括异常类型1和异常的变量名。
S404,基于第一函数的函数标识和异常信息对应的异常类型,生成异常信息集。
其中,异常信息集(exception_to_function_multimap)可以是字典类型或数组格式的集合。
在一个实施例中,终端第一函数的函数标识为键,以异常信息对应的异常类型为值,将函数标识和异常类型插入异常信息集中,从而得到关于目标文件中各进行了异常捕捉的函数的异常信息集。
S406,以抛出异常的函数节点为起始点,从函数节点关系图中查找与异常信息集匹配、且未进行异常捕捉的目标函数节点。
在一个实施例中,终端以抛出异常的函数节点为起始点,从函数节点关系图中查找与异常信息集中的函数标识和/或异常类型匹配、且未进行异常捕捉的目标函数节点。从而不至于对所有用户不关注的异常类型进行报错。其中,不同的函数,其异常类型可能会不同。
例如,如图3所示,若异常信息集中的异常类型为NullPointerException,且函数节点3、函数节点4均抛出了IndexOutOfBoundsException,而函数节点6抛出了NullPointerException。那么,在遍历的过程中,将对函数节点3→函数节点2→函数节点1和函数节点4→函数节点2→函数节点1这两条调用链进行排除,即不对这两条调用链进行后续的报错;得到函数节点6→函数节点5,只对这条调用链进行后续的报错。
在一个实施例中,终端确定目标函数节点对应的目标函数在目标文件中的调用位置;根据调用位置,判断目标函数中的目标子函数是否在异常捕捉函数的捕捉范围内;若否,则将目标子函数从目标函数中滤除;根据滤除目标子函数后的目标函数确定最终的目标函数节点。
其中,调用位置可以指目标函数在原程序文件中的位置,如目标函数在原程序文件的第几行。在函数节点关系图中,属于预设异常类型但未进行异常捕捉的目标函数节点的数量通常为多个,因此对应的目标函数也为多个。
例如,目标函数Function()中包含了function1()、function2()和function3(),终端可以根据Function()在原程序文件的行数在原程序文件中找到该Function(),然后判断该Function()的目标子函数是否在try catch语句中try的捕捉范围,若function1()未在try catch语句中try的捕捉范围,则将function1()从目标函数Function()滤除。
在一个实施例中,该方法还包括:终端从目标文件中读取抛出异常的第二函数和对应的第二异常信息;基于第二函数的函数标识和第二异常信息的异常标识,生成异常函数集。S406具体可以包括:终端在函数节点关系图遍历与异常函数集匹配的函数节点;从遍历的函数节点中,选取与异常信息集匹配、且未进行异常捕捉的目标函数节点。
其中,抛出异常可以指采用throw语句将函数的异常进行抛出。异常函数集(function_to_catched_exception_multimap)可以是用于存储第二函数的函数标识和第二异常信息的异常标识的集合。
在一个实施例中,终端在进行遍历时,基于异常函数集对函数节点关系图中的函数节点进行遍历,即对抛出异常的函数节点进行遍历,且该抛出的异常属于第二异常信息的异常标识所对应的异常类型,而不对未抛出异常的函数节点进行遍历,以及不对抛出的异常不属于该异常标识所对应的异常类型的函数节点进行遍历。
在一个实施例中,该方法应用于异常检测工具,异常检测工具中配置了异常类型关注项和文件标识关注项;该方法还包括:在异常信息集中,终端将与异常类型关注项不匹配的异常类型和对应的函数标识进行删除,得到待检测函数。上述在函数节点关系图遍历与异常函数集匹配的函数节点的步骤,具体可以包括:终端在函数节点关系图遍历与待检测函数匹配的函数节点。
其中,异常类型关注项可以指用户在进行测试时,所关注的异常类型。文件标识关注项可以指用户在进行测试时,所关注的文件的标识,如用户关注的是xxx.class文件,则在测试时对xxx.class文件进行异常检测。异常类型关注项和文件标识关注项属于过滤条件,在进行异常检测时,根据异常类型关注项和文件标识关注项过滤掉不符合要求的数据。
在一个实施例中,上述从目标文件中读取函数和函数之间的关联关系的步骤,具体可以包括:终端依据文件标识关注项,从目标文件中选取目标检测文件;从目标文件中读取函数和函数之间的关联关系。
在一个实施例中,异常检测工具中还配置了过滤条件;该方法还包括:终端在函数节点关系图中确定抛出异常的函数节点;根据过滤条件判断对抛出异常的函数节点进行过滤,得到过滤后函数节点。上述以抛出异常的函数节点为起始点的步骤,具体可以包括:终端以过滤后函数节点为起始点。
其中,过滤项也属于过滤条件,是指需要过滤掉当第几个输入参数下函数肯定不会为null的情况。
过滤条件的配置,可以使异常检测工具报告的bug数不至于太多,因为在测试过程中,可能只关注某几种unchecked exception,而且可能只关心某些包里的代码,而其它大部分库代码可能不关心,而且可能需要剔除一些输入参数下函数的输出肯定不会为null的情况。
在一个实施例中,该方法还可以包括:终端从目标文件中读取类的继承关系和对应的类标识;基于类标识和继承关系生成继承关系集。上述从遍历的函数节点中,选取与异常信息集匹配、且未进行异常捕捉的目标函数节点的步骤,具体可以包括:终端在从遍历的函数节点中,根据继承关系查找存在继承关系的类所对应的函数节点;从存在关联关系的函数节点中,选取与异常信息集匹配、且未进行异常捕捉的目标函数节点。
其中,继承关系集(parents_to_child_multimap)是对继承关系子集(child_to_parents_multimap)所构成的集合。
在一个实施例中,类包括孙类、子类和父类;继承关系包括孙类到子类的第一映射,以及子类到父类的第二映射。上述基于类标识和继承关系生成继承关系集的步骤,具体可以包括:根据第一映射和第二映射,确定孙类到对应父类的第三映射;基于孙类、子类和父类,以及对应的第一映射、第二映射和第三映射生成继承关系集。
例如,在目标文件中读取的继承关系为父与子之间的映射关系,如class1调用了class2,而class2调用了class3,那么读取出来的继承关系即为class1与class2之间的映射关系,以及class2与class3之间的映射关系,然后以class1的名称为键、class2的名称为值保存于child_to_parents_multimap,以及,以class2的名称为键、class3的名称为值保存于child_to_parents_multimap。然后,再对child_to_parents_multimap进行整理,得到以父类的名称为key,子孙后代类的名称为value的parents_to_child_multimap。
S408,当函数节点关系图中包含基于目标函数节点组成的调用链时,则进行报错。
在一个实施例中,S408具体可以包括:当函数节点关系图中包含基于目标函数节点组成的调用链时,则根据生成包含调用链的报错信息;将报错信息进行输出显示。由于该报错信息包含了调用链,开发人员可以很容易的看出哪些调用链上没有进行异常捕捉,以及没有捕捉的异常类型,如没有catch哪种unchecked exception。
上述实施例中,通过配置异常类型关注项、文件标识关注项以及其它的过滤项,从而可以把异常检测的关注焦点限定在文件标识关注项所对应的目标文件,以及限定在异常类型关注项对应的特定异常类型,以及将输入参数下函数的输出肯定不会为null的情况进行剔除,从而可以使异常检测工具报告的bug数不至于太多,从而提高了检测精准度以及检测效果。
作为一个示例,异常检测方法可用于发现整个调用链都没有catch的uncheckedexception,该方法可基于异常检测工具来实现,该异常检测工具可以是FindBugs,该FindBugs为开源的分析字节码的静态分析工具。
该异常检测工具既可以在命令行工具中触发,也可以在IDE(比如Eclipse,IntelliJ IDEA)中触发,如图5所示。在进行异常检测之前,先进行配置,然后进行异常检测,即配置一次,后续编译完成后会自动触发该异常检测工具。
一、配置过程
1、增加编译后任务
通过增加编译后任务,可以使该异常检测工具在编译后能被触发,因为该异常检测工具分析的是编译产生的字节码,字节码的最小组织文件是.class文件。
2、配置过滤条件
通过配置过滤条件,可以使该异常检测工具报告的bug数不至于太多,因为可能只关注某几种unchecked exception,而且只关心某些包里的代码,比如大部分库代码可能不关心,而且可能需要剔除一些在输入参数下函数肯定不会为null的情况。
二、异常检测过程
1、触发编译
通过编译器对原程序文件进行编译,如对.java文件进行编译,得到.class文件。
2、触发检测
由于IDE或命令行工具中配置了编译后任务,在编译完成后,将会自动调用异常检测工具,对.class文件进行检测,以判断整条调用链是否采用try catch语句来捕捉unchecked exception。
3、返回bug信息
其中,该bug信息即为上述实施例中的报错信息。
当判断出整条调用链都未采用try catch语句来捕捉unchecked exception,异常检测工具将返回bug信息。
4、展示bug信息
bug信息中会包含调用链的信息,这样开发人员可以很容易的看出哪些调用链上没有捕捉unchecked exception,也很容易看出没有捕捉哪种unchecked exception。
作为另一个示例,如图6所示,发现整个调用链都没有catch的uncheckedexception的方法包括以下步骤:
(1)在获得编译后产生的.class文件后,扫描所有.class文件,以找出:会抛uncheck exception的函数、函数的调用关系、函数有处理的异常以及类型的继承关系;
(2)汇总补充调用边,完善调用关系图;
(3)从抛异常的函数节点出发,递归遍历函数调用关系图,找出没有被catch或处理的uncheck exception。
1、参数配置
(1)配置关注的exceptions:concern_exceptions;
(2)配置关注的包:concern_packages;
(3)配置其它:other_conditions,如需要过滤掉当第几个输入参数下函数肯定不会为null的情况。
2、对编译产生的.class文件进行分析,构建以下全局function_to_node_map、exception_to_function_multimap、function_to_catched_exception_multimap和child_to_parents_multimap,构建过程如下:
(1)记录.class文件中的每个函数,并为每个函数生成一个对应的函数节点,然后将函数的名称和函数节点插入function_to_node_map;依据调用关系为每个被调用的函数在function_to_node_map中找到对应的函数节点或者生成一个函数节点,为该函数节点生成被调用边(该被调用边也即入边),该被调用边一端连接了被调用函数所对应的函数节点,另一端连接了调用方的函数所对应的函数节点,每个函数对应有调用位置等信息,这样可以构建出一个调用关系图。需要指出的是,对调用发起方的函数而言,被调用边也为其调用边。
(2)记录.class文件中抛出了哪些异常,然后将这些抛出的异常插入exception_to_function_multimap。
(3)记录.class文件中catch了哪些异常,然后将这些catch的异常插入function_to_catched_exception_multimap。
(4)记录.class文件中类的继承关系和实现了哪些接口,然后将子类名称,value为父类或接口的名称插入child_to_parents_multimap。
(5)全局map的说明:
function_to_node_map,key是函数名称,value为函数对应的节点。
exception_to_function_multimap,key是抛出的异常名称,value为函数名称。
function_to_catched_exception_multimap,key是函数名称,value为该函数有catch或处理的异常信息(里面包括了catch覆盖的范围)。
child_to_parents_multimap,key是子类全名称,value为父类或接口的名称。
3、汇总预处理
(1)整理child_to_parents_multimap,得到一个以父类或接口的全名称为key,子孙后代类的全名称为value的parents_to_child_multimap。
(2)为多态补充被调用边:遍历parents_to_child_multimap,用key从function_to_node_map找到节点,查看它的被调用边找到调用节点,补充value指向的函数节点到前述调用节点的被调用边
4.汇总分析
(1)在exception_to_function_multimap中,利用concern_exceptions和concern_packages过滤出需要检查的函数(need_check_functions)。
(2)遍历need_check_functions,从function_to_node_map找到抛出异常的函数节点,递归遍历function_to_node_map中函数节点的被调用边,针对调用函数节点做以下检查:根据other_conditions判断是否需要跳过,如果不需要跳过,则根据function_to_catched_exception_multimap判断该函数节点是否catch异常,若catch异常,则利用调用位置过滤,若剩下的是相关异常(判断异常的继承关系可能需要用到parents_to_child_multimap),则退出;若未catch异常,则一直向上遍历直至没有被调用边,这时即可报bug了,因为整个调用链上都没有catch异常。
举例说明,main函数调用了ClassBase的do_work函数和do_more_work函数,其中,ClassBase的do_work函数和do_more_work函数都不抛出异常,而对于ClassBase的子类ClassDerive,该子类ClassDerive的do_work函数会抛异常,如抛NullPointerException。
调用do_work的地方有catch Exception,调用do_more_work的地方没有catch任何异常。其中,ClassDerive继承自ClassBase,实现了自己do_work和do_more_work,它们都可能抛NullPointerException,这是一种uncheck exception,如图7所示。
若配置的参数为concern_exceptions=NullPointerException,那么会找到classDerive的两个函数节点,从图8右边的classDerive::do_work出发,发现一个从main过来的调用,检查发现有catch Exception,该Exception是NullPointerException的父类,则不对该条调用链进行报错。接着,从classDerive::do_more_work出发,发现一个从main过来的调用,没有catch任何异常,所以这条调用链上有关注的异常但没有catch,此时可以对该条调用链进行报错。
通过上述实施例的方案,可以具有以下技术效果:
(1)可以发现可能发生的异常但又没有被catch的情况,避免在生产环境因这种情况而退出的问题;
(2)对于使用了第三方库的项目,由于不知道第三方库会抛出什么uncheckexception,也不知道有没有catch这些uncheck exception,通过本实施例的方案,可以有效地检测出是否catch这些uncheck exception。
应该理解的是,虽然图2、4的流程图中的各个步骤按照箭头的指示依次显示,但是这些步骤并不是必然按照箭头指示的顺序依次执行。除非本文中有明确的说明,这些步骤的执行并没有严格的顺序限制,这些步骤可以以其它的顺序执行。而且,图2、4中的至少一部分步骤可以包括多个步骤或者多个阶段,这些步骤或者阶段并不必然是在同一时刻执行完成,而是可以在不同的时刻执行,这些步骤或者阶段的执行顺序也不必然是依次进行,而是可以与其它步骤或者其它步骤中的步骤或者阶段的至少一部分轮流或者交替地执行。
在一个实施例中,如图9所示,提供了一种异常检测装置,该装置可以采用软件模块或硬件模块,或者是二者的结合成为计算机设备的一部分,该装置具体包括:获取模块902、读取模块904、生成模块906、查找模块908和报错模块910,其中:
获取模块902,用于获取对原程序文件编译所产生的目标文件;
读取模块904,用于从目标文件中读取函数和函数之间的关联关系;
生成模块906,用于基于函数和对应的关联关系生成函数节点关系图;
查找模块908,用于在函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
报错模块910,用于当函数节点关系图中包含基于目标函数节点组成的调用链时,则进行报错。
在一个实施例中,获取模块902,还用于获取原程序文件;通过编译器对原程序文件进行编译,得到编译所产生的目标文件;
读取模块904,还用于当编译器完成对原程序文件的编译时,调用异常检测工具;在目标文件中,通过异常检测工具读取函数和函数之间的关联关系。
在一个实施例中,生成模块906,还用于确定函数的函数标识;生成与函数对应的函数节点;将函数标识和函数节点保存于函数节点集;根据关联关系生成与函数节点集中的函数节点对应的调用边;基于调用边和函数节点集构建函数节点关系图。
在一个实施例中,报错模块910,还用于当函数节点关系图中包含基于目标函数节点组成的调用链时,则根据生成包含调用链的报错信息;将报错信息进行输出显示。
上述实施例中,通过对原程序文件进行编译得到目标文件,根据目标文件可以读取出每个函数和函数间的关联关系,利用该函数和对应的关联关系构建函数节点关系图,以抛出异常的函数节点为起始点遍历该函数节点关系图,得到属于预设异常类型但未进行异常捕捉的目标函数节点,从而可以找出所有可能出现不可查异常但未进行异常捕捉的目标函数节点,对由该目标函数节点构成的整条调用链(即起始点至函数终节点之间的所有函数节点)进行报错,实现了在编译阶段对不可查异常的函数进行异常排查;由于可以发现可能出现不可查异常但又未进行异常捕捉的情况,从而可以对原程序文件进行问题排查,进而可以有效避免应用程序因不可查异常而退出的问题。
在一个实施例中,读取模块904,还用于从目标文件中,读取进行了异常捕捉的第一函数和对应的第一异常信息;
生成模块906,还用于基于第一函数的函数标识和异常信息对应的异常类型,生成异常信息集;
查找模块908,还用于从函数节点关系图中查找与异常信息集匹配、且未进行异常捕捉的目标函数节点。
在一个实施例中,如图10所示,该装置还包括:确定模块912、判断模块914和滤除模块916;其中:
确定模块912,用于确定目标函数节点对应的目标函数在目标文件中的调用位置;
判断模块914,用于根据调用位置,判断目标函数中的目标子函数是否在异常捕捉函数的捕捉范围内;
滤除模块916,用于若目标子函数未在异常捕捉函数的捕捉范围内,则将第一函数从目标函数中滤除;
确定模块912,还用于根据滤除目标子函数后的目标函数确定最终的目标函数节点。
在一个实施例中,读取模块904,还用于从目标文件中读取抛出异常的第二函数和对应的第二异常信息;
生成模块906,还用于基于第二函数的函数标识和第二异常信息的异常标识,生成异常函数集;
查找模块908,还用于在函数节点关系图遍历与异常函数集匹配的函数节点;从遍历的函数节点中,选取与异常信息集匹配、且未进行异常捕捉的目标函数节点。
在一个实施例中,该装置应用于异常检测工具,异常检测工具中配置了异常类型关注项;该装置还包括:删除模块918;其中:
删除模块918,用于在异常信息集中,将与异常类型关注项不匹配的异常类型和对应的函数标识进行删除,得到待检测函数;
查找模块908,还用于在函数节点关系图遍历与待检测函数匹配的函数节点。
在一个实施例中,异常检测工具中还配置了文件标识关注项;读取模块904,还用于依据文件标识关注项,从目标文件中选取目标检测文件;从目标文件中读取函数和函数之间的关联关系。
在一个实施例中,异常检测工具中还配置了过滤条件;确定模块912,还用于在函数节点关系图中确定抛出异常的函数节点;
滤除模块916,还用于根据过滤条件判断对抛出异常的函数节点进行过滤,得到过滤后函数节点;
查找模块908,还用于以过滤后函数节点为起始点。
在一个实施例中,读取模块904,还用于从目标文件中读取类的继承关系和对应的类标识;
生成模块906,还用于基于类标识和继承关系生成继承关系集;
查找模块908,还用于在从遍历的函数节点中,根据继承关系查找存在继承关系的类所对应的函数节点;从存在关联关系的函数节点中,选取与异常信息集匹配、且未进行异常捕捉的目标函数节点。
在一个实施例中,类包括孙类、子类和父类;继承关系包括孙类到子类的第一映射,以及子类到父类的第二映射。生成模块906,还用于根据第一映射和第二映射,确定孙类到对应父类的第三映射;基于孙类、子类和父类,以及对应的第一映射、第二映射和第三映射生成继承关系集。
关于异常检测装置的具体限定可以参见上文中对于异常检测方法的限定,在此不再赘述。上述异常检测装置中的各个模块可全部或部分通过软件、硬件及其组合来实现。上述各模块可以硬件形式内嵌于或独立于计算机设备中的处理器中,也可以以软件形式存储于计算机设备中的存储器中,以便于处理器调用执行以上各个模块对应的操作。
在一个实施例中,提供了一种计算机设备,该计算机设备可以是终端,其内部结构图可以如图11所示。该计算机设备包括通过系统总线连接的处理器、存储器、通信接口、显示屏和输入装置。其中,该计算机设备的处理器用于提供计算和控制能力。该计算机设备的存储器包括非易失性存储介质、内存储器。该非易失性存储介质存储有操作系统和计算机程序。该内存储器为非易失性存储介质中的操作系统和计算机程序的运行提供环境。该计算机设备的通信接口用于与外部的终端进行有线或无线方式的通信,无线方式可通过WIFI、运营商网络、NFC(近场通信)或其他技术实现。该计算机程序被处理器执行时以实现一种异常检测方法。该计算机设备的显示屏可以是液晶显示屏或者电子墨水显示屏,该计算机设备的输入装置可以是显示屏上覆盖的触摸层,也可以是计算机设备外壳上设置的按键、轨迹球或触控板,还可以是外接的键盘、触控板或鼠标等。
本领域技术人员可以理解,图11中示出的结构,仅仅是与本申请方案相关的部分结构的框图,并不构成对本申请方案所应用于其上的计算机设备的限定,具体的计算机设备可以包括比图中所示更多或更少的部件,或者组合某些部件,或者具有不同的部件布置。
在一个实施例中,还提供了一种计算机设备,包括存储器和处理器,存储器中存储有计算机程序,该处理器执行计算机程序时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机可读存储介质,存储有计算机程序,该计算机程序被处理器执行时实现上述各方法实施例中的步骤。
在一个实施例中,提供了一种计算机程序产品或计算机程序,该计算机程序产品或计算机程序包括计算机指令,该计算机指令存储在计算机可读存储介质中。计算机设备的处理器从计算机可读存储介质读取该计算机指令,处理器执行该计算机指令,使得该计算机设备执行上述各方法实施例中的步骤。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分流程,是可以通过计算机程序来指令相关的硬件来完成,所述的计算机程序可存储于一非易失性计算机可读取存储介质中,该计算机程序在执行时,可包括如上述各方法的实施例的流程。其中,本申请所提供的各实施例中所使用的对存储器、存储、数据库或其它介质的任何引用,均可包括非易失性和易失性存储器中的至少一种。非易失性存储器可包括只读存储器(Read-Only Memory,ROM)、磁带、软盘、闪存或光存储器等。易失性存储器可包括随机存取存储器(Random Access Memory,RAM)或外部高速缓冲存储器。作为说明而非局限,RAM可以是多种形式,比如静态随机存取存储器(Static Random Access Memory,SRAM)或动态随机存取存储器(Dynamic Random Access Memory,DRAM)等。
以上实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。
以上所述实施例仅表达了本申请的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本申请构思的前提下,还可以做出若干变形和改进,这些都属于本申请的保护范围。因此,本申请专利的保护范围应以所附权利要求为准。
Claims (15)
1.一种异常检测方法,其特征在于,所述方法包括:
获取对原程序文件编译所产生的目标文件;
从所述目标文件中读取函数和所述函数之间的关联关系;
基于所述函数和对应的所述关联关系生成函数节点关系图;
在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
2.根据权利要求1所述的方法,其特征在于,所述获取对原程序文件编译所产生的目标文件包括:
获取所述原程序文件;
通过编译器对所述原程序文件进行编译,得到编译所产生的目标文件;
所述从所述目标文件中读取函数和所述函数之间的关联关系包括:
当所述编译器完成对所述原程序文件的编译时,调用异常检测工具;
在所述目标文件中,通过所述异常检测工具读取函数和所述函数之间的关联关系。
3.根据权利要求1所述的方法,其特征在于,所述基于所述函数和对应的所述关联关系生成函数节点关系图包括:
确定所述函数的函数标识;
生成与所述函数对应的所述函数节点;
将所述函数标识和所述函数节点保存于函数节点集;
根据所述关联关系生成与所述函数节点集中的函数节点对应的调用边;
基于所述调用边和所述函数节点集构建所述函数节点关系图。
4.根据权利要求1所述的方法,其特征在于,所述方法还包括:
从所述目标文件中,读取进行了异常捕捉的第一函数和对应的第一异常信息;
基于所述第一函数的函数标识和所述异常信息对应的异常类型,生成异常信息集;
所述依次查找属于预设异常类型但未进行异常捕捉的目标函数节点包括:
从所述函数节点关系图中查找与所述异常信息集匹配、且未进行异常捕捉的目标函数节点。
5.根据权利要求4所述的方法,其特征在于,所述方法还包括:
从所述目标文件中读取抛出异常的第二函数和对应的第二异常信息;
基于所述第二函数的函数标识和第二异常信息的异常标识,生成异常函数集;
所述从所述函数节点关系图中查找与所述异常信息集匹配、且未进行异常捕捉的目标函数节点包括:
在所述函数节点关系图遍历与所述异常函数集匹配的函数节点;
从遍历的所述函数节点中,选取与所述异常信息集匹配、且未进行异常捕捉的目标函数节点。
6.根据权利要求5所述的方法,其特征在于,所述方法应用于异常检测工具,所述异常检测工具中配置了异常类型关注项;所述方法还包括:
在所述异常信息集中,将与所述异常类型关注项不匹配的异常类型和对应的函数标识进行删除,得到待检测函数;
所述在所述函数节点关系图遍历与所述异常函数集匹配的函数节点包括:
在所述函数节点关系图遍历与所述待检测函数匹配的函数节点。
7.根据权利要求6所述的方法,其特征在于,所述异常检测工具中还配置了文件标识关注项;所述从所述目标文件中读取函数和所述函数之间的关联关系包括:
依据所述文件标识关注项,从所述目标文件中选取目标检测文件;
从所述目标文件中读取函数和所述函数之间的关联关系。
8.根据权利要求6所述的方法,其特征在于,所述异常检测工具中还配置了过滤项;所述方法还包括:
在所述函数节点关系图中确定所述抛出异常的函数节点;
根据所述过滤项判断对所述抛出异常的函数节点进行过滤,得到过滤后函数节点;
所述以抛出异常的函数节点为起始点包括:
以所述过滤后函数节点为起始点。
9.根据权利要求5所述的方法,其特征在于,所述方法还包括:
从所述目标文件中读取类的继承关系和对应的类标识;
基于所述类标识和所述继承关系生成继承关系集;
所述从遍历的所述函数节点中,选取与所述异常信息集匹配、且未进行异常捕捉的目标函数节点包括:
在从遍历的所述函数节点中,根据所述继承关系查找存在所述继承关系的类所对应的函数节点;
从存在所述关联关系的函数节点中,选取与所述异常信息集匹配、且未进行异常捕捉的目标函数节点。
10.根据权利要求9所述的方法,其特征在于,所述类包括孙类、子类和父类;所述继承关系包括所述孙类到所述子类的第一映射,以及所述子类到父类的第二映射;所述基于所述类标识和所述继承关系生成继承关系集包括:
根据所述第一映射和所述第二映射,确定所述孙类到对应父类的第三映射;
基于所述孙类、所述子类和所述父类,以及对应的所述第一映射、所述第二映射和所述第三映射生成继承关系集。
11.根据权利要求1至10中的任一项所述的方法,其特征在于,所述方法还包括:
确定所述目标函数节点对应的目标函数在所述目标文件中的调用位置;
根据所述调用位置,判断所述目标函数中的目标子函数是否在异常捕捉函数的捕捉范围内;
若否,则将所述目标子函数从所述目标函数中滤除;
根据滤除所述目标子函数后的所述目标函数确定最终的目标函数节点。
12.根据权利要求1至10中的任一项所述的方法,其特征在于,所述当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错包括:
当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则根据生成包含所述调用链的报错信息;
将所述报错信息进行输出显示。
13.一种异常检测装置,其特征在于,所述装置包括:
获取模块,用于获取对原程序文件编译所产生的目标文件;
读取模块,用于从所述目标文件中读取函数和所述函数之间的关联关系;
生成模块,用于基于所述函数和对应的所述关联关系生成函数节点关系图;
查找模块,用于在所述函数节点关系图中,以抛出异常的函数节点为起始点,依次查找属于预设异常类型但未进行异常捕捉的目标函数节点;
报错模块,用于当所述函数节点关系图中包含基于所述目标函数节点组成的调用链时,则进行报错。
14.一种计算机设备,包括存储器和处理器,所述存储器存储有计算机程序,其特征在于,所述处理器执行所述计算机程序时实现权利要求1至12中任一项所述的方法的步骤。
15.一种计算机可读存储介质,存储有计算机程序,其特征在于,所述计算机程序被处理器执行时实现权利要求1至12中任一项所述的方法的步骤。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011071489.3A CN114328168A (zh) | 2020-10-09 | 2020-10-09 | 异常检测方法、装置、计算机设备和存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202011071489.3A CN114328168A (zh) | 2020-10-09 | 2020-10-09 | 异常检测方法、装置、计算机设备和存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN114328168A true CN114328168A (zh) | 2022-04-12 |
Family
ID=81032797
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202011071489.3A Pending CN114328168A (zh) | 2020-10-09 | 2020-10-09 | 异常检测方法、装置、计算机设备和存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN114328168A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115809417A (zh) * | 2023-02-09 | 2023-03-17 | 新风光电子科技股份有限公司 | 用于高压变频器控制柜的生产线运行信号检测方法 |
CN116541305A (zh) * | 2023-06-26 | 2023-08-04 | 京东方艺云(杭州)科技有限公司 | 一种异常检测的方法、装置、电子设备及存储介质 |
Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6378087B1 (en) * | 1999-06-08 | 2002-04-23 | Compaq Computer Corporation | System and method for dynamically detecting unchecked error condition values in computer programs |
US6601018B1 (en) * | 1999-02-04 | 2003-07-29 | International Business Machines Corporation | Automatic test framework system and method in software component testing |
CN1492320A (zh) * | 2002-10-25 | 2004-04-28 | 华为技术有限公司 | Windows程序异常捕获及定位方法 |
JP2007179488A (ja) * | 2005-12-28 | 2007-07-12 | Fujitsu Ltd | ソースコード問題予測プログラム |
US7743370B1 (en) * | 2005-10-17 | 2010-06-22 | Unisys Corporation | System and methods for determination of independence of sub-graphs in a graph-based intermediate representation of program instructions |
CN103365774A (zh) * | 2013-08-22 | 2013-10-23 | 北京航空航天大学 | 基于函数调用关系的瞬时错误检测方法 |
US20140237453A1 (en) * | 2013-02-20 | 2014-08-21 | Bmc Software, Inc. | Exception based quality assessment |
US20160371068A1 (en) * | 2015-06-16 | 2016-12-22 | Fujitsu Limited | Computer that performs compiling, compiler program, and link program |
CN106502874A (zh) * | 2016-10-26 | 2017-03-15 | 南京途牛科技有限公司 | 一种调用链跟踪方法 |
CN110321275A (zh) * | 2018-03-29 | 2019-10-11 | 腾讯科技(上海)有限公司 | 程序监控方法、装置、计算设备以及存储介质 |
CN110673929A (zh) * | 2019-09-29 | 2020-01-10 | 北京智游网安科技有限公司 | 一种保护异常机制的方法、智能终端及存储介质 |
US10782941B1 (en) * | 2019-06-20 | 2020-09-22 | Fujitsu Limited | Refinement of repair patterns for static analysis violations in software programs |
-
2020
- 2020-10-09 CN CN202011071489.3A patent/CN114328168A/zh active Pending
Patent Citations (12)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US6601018B1 (en) * | 1999-02-04 | 2003-07-29 | International Business Machines Corporation | Automatic test framework system and method in software component testing |
US6378087B1 (en) * | 1999-06-08 | 2002-04-23 | Compaq Computer Corporation | System and method for dynamically detecting unchecked error condition values in computer programs |
CN1492320A (zh) * | 2002-10-25 | 2004-04-28 | 华为技术有限公司 | Windows程序异常捕获及定位方法 |
US7743370B1 (en) * | 2005-10-17 | 2010-06-22 | Unisys Corporation | System and methods for determination of independence of sub-graphs in a graph-based intermediate representation of program instructions |
JP2007179488A (ja) * | 2005-12-28 | 2007-07-12 | Fujitsu Ltd | ソースコード問題予測プログラム |
US20140237453A1 (en) * | 2013-02-20 | 2014-08-21 | Bmc Software, Inc. | Exception based quality assessment |
CN103365774A (zh) * | 2013-08-22 | 2013-10-23 | 北京航空航天大学 | 基于函数调用关系的瞬时错误检测方法 |
US20160371068A1 (en) * | 2015-06-16 | 2016-12-22 | Fujitsu Limited | Computer that performs compiling, compiler program, and link program |
CN106502874A (zh) * | 2016-10-26 | 2017-03-15 | 南京途牛科技有限公司 | 一种调用链跟踪方法 |
CN110321275A (zh) * | 2018-03-29 | 2019-10-11 | 腾讯科技(上海)有限公司 | 程序监控方法、装置、计算设备以及存储介质 |
US10782941B1 (en) * | 2019-06-20 | 2020-09-22 | Fujitsu Limited | Refinement of repair patterns for static analysis violations in software programs |
CN110673929A (zh) * | 2019-09-29 | 2020-01-10 | 北京智游网安科技有限公司 | 一种保护异常机制的方法、智能终端及存储介质 |
Non-Patent Citations (2)
Title |
---|
修宗达: "云平台的请求跟踪及异常检测系统", 《中国优秀硕士学位论文全文数据库 信息科技辑》, 15 June 2014 (2014-06-15) * |
姜淑娟;徐宝文;姜元鹏;: "一个异常传播分析工具的设计与实现", 计算机科学, no. 07, 25 July 2008 (2008-07-25) * |
Cited By (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN115809417A (zh) * | 2023-02-09 | 2023-03-17 | 新风光电子科技股份有限公司 | 用于高压变频器控制柜的生产线运行信号检测方法 |
CN115809417B (zh) * | 2023-02-09 | 2023-05-09 | 新风光电子科技股份有限公司 | 用于高压变频器控制柜的生产线运行信号检测方法 |
CN116541305A (zh) * | 2023-06-26 | 2023-08-04 | 京东方艺云(杭州)科技有限公司 | 一种异常检测的方法、装置、电子设备及存储介质 |
CN116541305B (zh) * | 2023-06-26 | 2023-12-15 | 京东方艺云(杭州)科技有限公司 | 一种异常检测的方法、装置、电子设备及存储介质 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Guo et al. | Characterizing and detecting resource leaks in Android applications | |
Le et al. | Deep specification mining | |
KR101246623B1 (ko) | 악성 애플리케이션 진단 장치 및 방법 | |
CN105630463B (zh) | 用于检测jar包冲突的方法及装置 | |
US7275239B2 (en) | Run-time wait tracing using byte code insertion | |
Sui et al. | On the recall of static call graph construction in practice | |
CN110704306B (zh) | 测试中的断言处理方法、装置、设备及存储介质 | |
US10599558B1 (en) | System and method for identifying inputs to trigger software bugs | |
Zhang et al. | Ripple: Reflection analysis for android apps in incomplete information environments | |
CN111723380B (zh) | 一种检测组件漏洞的方法及装置 | |
CN108984416B (zh) | 一种评估Maven环境中依赖冲突危险级别的方法 | |
CN110928777B (zh) | 测试用例的处理方法、装置、设备及存储介质 | |
CN109857520B (zh) | 一种虚拟机自省中的语义重构改进方法及系统 | |
Alves et al. | Prioritizing test cases for early detection of refactoring faults | |
US10229273B2 (en) | Identifying components for static analysis of software applications | |
CN114328168A (zh) | 异常检测方法、装置、计算机设备和存储介质 | |
CN106933642B (zh) | 应用程序的处理方法及处理装置 | |
Xu et al. | A dynamic taint analysis tool for android app forensics | |
US11868465B2 (en) | Binary image stack cookie protection | |
Mitropoulos et al. | Measuring the occurrence of security-related bugs through software evolution | |
CN110781081B (zh) | 一种移动应用回调强制触发方法、系统及存储介质 | |
CN109472135A (zh) | 一种检测进程注入的方法、装置及存储介质 | |
US8291389B2 (en) | Automatically detecting non-modifying transforms when profiling source code | |
CN111444093A (zh) | 项目开发过程质量的确定方法、装置、计算机设备 | |
US11860765B2 (en) | Method and system for fuzzing windows kernel by utilizing type information obtained through binary static analysis |
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 |