一种程序代码的异常检测方法、装置、设备以及存储介质与流程
未命名
10-18
阅读:120
评论:0
1.本公开涉及计算机技术领域,尤其涉及代码测试、漏洞挖掘和软件安全等技术领域,具体涉及一种程序代码的异常检测方法、装置、设备以及存储介质。
背景技术:
2.在现代分布式系统中,使用微服务架构的各个服务之间通过rpc(remote procedure call,远程过程调用)请求进行通信。当rpc请求发送失败时,通常会进行请求的重试,直到请求成功或达到一定的重试次数为止。
3.目前,go语言(一种静态强类型、编译型语言,又称golang)中存在封装有rpc请求的重试逻辑的通信框架。若上游服务的程序代码中使用了封装有该重试逻辑的通信框架,在向下游服务发送rpc请求失败时,自动触发请求的重试。
技术实现要素:
4.本公开提供了一种程序代码的异常检测方法、装置、设备以及存储介质。
5.根据本公开的一方面,提供了一种程序代码的异常检测方法,包括:
6.识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;
7.基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;
8.若是,输出用于表征所述目标函数存在异常的报错信息。
9.根据本公开的另一方面,提供了一种程序代码的异常检测装置,包括:
10.识别模块,用于识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;
11.检测模块,用于基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;
12.输出模块,用于若是,输出用于表征所述目标函数存在异常的报错信息。
13.根据本公开的另一方面,提供了一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述任一项所述的程序代码的异常检测方法。
14.根据本公开的另一方面,提供了一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据上述任一项所述的程序代码的异常检测方法。
15.根据本公开的另一方面,提供了一种计算机程序产品,包括计算机程序,所述计算
机程序在被处理器执行时实现根据上述任一项所述的程序代码的异常检测方法。
16.应当理解,本部分所描述的内容并非旨在标识本公开的实施例的关键或重要特征,也不用于限制本公开的范围。本公开的其它特征将通过以下的说明书而变得容易理解。
附图说明
17.附图用于更好地理解本方案,不构成对本公开的限定。其中:
18.图1是根据本公开一种程序代码的异常检测方法的流程图;
19.图2是根据本公开检测目标函数是否被调用的一种流程图;
20.图3是根据本公开检测目标函数是否被调用的另一种流程图;
21.图4是根据本公开一种程序代码的异常检测装置的结构示意图;
22.图5是用来实现本公开实施例的程序代码的异常检测方法的电子设备的框图。
具体实施方式
23.以下结合附图对本公开的示范性实施例做出说明,其中包括本公开实施例的各种细节以助于理解,应当将它们认为仅仅是示范性的。因此,本领域普通技术人员应当认识到,可以对这里描述的实施例做出各种改变和修改,而不会背离本公开的范围和精神。同样,为了清楚和简明,以下的描述中省略了对公知功能和结构的描述。
24.下面,首先对本公开实施例所提供的一种程序代码的异常检测方法进行介绍。
25.本公开实施例所提供的一种程序代码的异常检测方法,可以应用于各类电子设备,例如,个人电脑、服务器、以及其他具有数据处理能力的设备。另外,可以理解的是,本公开实施例提供的程序代码的异常检测方法可以通过软件、硬件或软硬件结合的方式实现。
26.其中,本公开实施例所提供的一种程序代码的异常检测方法,可以包括如下步骤:
27.识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;
28.基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;
29.若是,输出用于表征所述目标函数存在异常的报错信息。
30.本公开提供的方案中,由于目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数,该目标通信框架中封装有rpc请求的重试逻辑;因此,通过检测该目标函数是否被循环函数所调用,且在检测到目标函数被循环函数调用时,输出用表征目标函数存在异常的报错信息,可以找到导致重试次数倍增的代码,从而对导致重试次数倍增的代码进行报错。进而使得相关工作人员可以根据所输出的报错信息,对目标程序代码中所存在的重复的重试逻辑进行修改,从而降低目标程序代码中的rpc请求的请求重试次数。可见,通过本方案,可以对导致重试次数倍增的代码进行报错,进而使相关工作人员可以根据报错内容进行代码修改,从而解决重试次数的倍增问题。
31.下面结合附图,对本公开实施例所提供的程序代码的异常检测方法进行介绍。
32.如图1所示,本公开实施例所提供的程序代码的异常检测方法,可以包括如下步骤:
33.s101,识别目标程序代码中的目标函数;其中,该目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;该目标通信框架中封装有rpc请求的重试逻辑;
34.本实施例中,目标程序代码可以是在执行时实现任一服务的、待进行异常检测的程序代码。可以理解的是,该目标程序代码中可以包括一个或多个函数,且目标程序代码在执行时实现任一服务的过程中,可以向该服务的下游服务发送rpc请求,当rpc请求发送失败时,可以在该目标程序代码中重新执行向该服务的下游服务发送rpc请求的程序代码,进行请求的重试。
35.可以理解的是,由于目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数,且该目标通信框架中封装有rpc请求的重试逻辑;因此,在调用该目标函数向下游服务发送rpc请求时,若发送rpc请求失败会自动触发请求的重试。此时,若目标程序代码在执行时重复调用该目标函数,则会导致重试次数倍增,从而增大下游服务压力,可能导致服务雪崩的情形。因此,本实施例可以先识别目标程序代码中的目标函数,后续通过分析该目标函数是否被重复调用,以检测该目标程序代码中是否存在异常。
36.其中,该预设结构体可以为用于进行目标函数的构建的结构体,在实际应用中,该目标通信框架可以是go语言的easy框架,该easy框架为对rpc请求的重试逻辑进行了封装的rpc通信框架;此时,该预设结构体可以为easy.client结构体。示例性的,若该目标函数为结构体client的函数,且该结构体client中包含有easy.client结构体,该easy.client结构体为该目标通信框架easy的预设结构体,此时,该目标函数为内嵌有目标通信框架的预设结构体的函数。
37.本领域普通技术人员可以知晓,在go语言中,结构体是由一批数据组合而成的结构型数据。组成结构型数据的每个数据称为结构型数据的成员,其描述了一块内存区间的大小及解释意义,其中每个成员可以具有不同的类型。go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性。嵌入结构体的成员,可以通过外部结构体的实例直接访问。
38.可选地,在一种实现方式中,该内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数符合预定命名规则;
39.相应地,在本实现方式中,识别目标程序代码中的目标函数,可以包括:
40.遍历该目标程序代码中的函数,若所遍历到的函数符合该预定命名规则,将所遍历到的函数确定为目标函数。
41.本实施例中,内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数可以符合预定命名规则,使得在识别目标函数时,可以通过检测该目标程序代码中的各个函数是否符合预定命名规则,来识别其是否为目标函数。示例性的,该预定命名规则可以是包含有预设字符串,或者,具有预设命名类型,例如驼峰式命名类型或者下划线式命名类型,这都是合理的。
42.示例性的,在一种具体的实现方式中,该预定命名规则可以包括:函数名称中包含有预设字符串。
43.本实现方式中,该预设字符串可以为基于该目标通信框架的框架代码,所生成的用于访问下游服务的函数的函数名称中所包含的字符串。
44.示例性的,在实际应用中,若目标通信框架是go语言的easy框架,则该预设字符串可以是“do”字符串。可以理解的是,由于在easy框架中,所有通过发送rpc请求访问下游服务的函数的函数名称都为“do”,且目标函数为内嵌有easy框架的预设结构体、且在执行时用于发送rpc请求的函数,因此,可以通过识别各个函数的函数名称中是否包含“do”字符串,确定该函数是否为目标函数。
45.可以理解的是,通过遍历该目标程序代码中的函数,以检测该目标程序代码中的各个函数是否符合预定命名规则,并将符合该预定命名规则的函数确定为目标函数,可以快速识别出目标程序代码中的目标函数。
46.需要说明的是,上述通过遍历该目标程序代码中的函数识别目标函数的方式仅仅作为一个示例,并不应该构成对识别该目标函数的方式的限定。在实际应用中,还可以通过对目标程序代码中的各个函数进行静态扫描,对各个函数内嵌的结构体中的结构体成员进行分析,以识别出目标函数。例如,针对easy框架而言,如果任一函数内嵌的结构体中存在名称为"ufcclient"的结构体成员,由于该名称为"ufcclient"的结构体成员为easy.client结构体的结构体成员,因此该函数可以确定为目标函数。
47.s102,基于该目标函数与该目标程序代码中的循环函数之间的代码逻辑关系,检测该目标函数是否被该循环函数所调用;
48.可以理解的是,由于目标函数为内嵌有目标通信框架的预设结构体的函数,在调用该目标函数向下游服务发送rpc请求时,若发送rpc请求失败会自动触发请求的重试,因此,若目标程序代码在执行时重复调用该目标函数,则会导致重试次数倍增。因此,为了在目标程序代码中检测出导致重试次数倍增的异常代码,可以分析该目标函数与该目标程序代码中的循环函数之间的代码逻辑关系,检测该目标函数是否被该循环函数所调用,从而检测目标程序代码中是否存在导致重试次数倍增的异常代码。
49.示例性的,该循环函数可以是for循环。在go语言中,对于请求重试这种场景,通常用for循环来实现。也就是,在for循环中调用发送rpc请求的函数,当执行因超时等原因导致rpc请求发送出错时,继续进入for循环,重新发送该rpc请求;当执行rpc请求发送成功时,跳出for循环。因此,可以通过检测目标函数是否被循环函数所调用,以识别出目标程序代码中是否存在重复的重试逻辑。
50.可选地,在一种实现方式中,基于该目标函数与该目标程序代码中的循环函数之间的代码逻辑关系,检测该目标函数是否被该循环函数所调用,可以包括:
51.基于该目标函数与该目标程序代码中的循环函数之间的代码逻辑关系,检测该目标函数是否被该循环函数直接调用或间接调用。
52.可以理解的是,由于被调用的情况存在直接调用和间接调用两种情况,因此,可以检测该目标函数是否被循环函数直接调用或间接调用。
53.需要说明的是,为了方案布局清晰,关于检测该目标函数是否被循环函数直接调用或间接调用的实现方式,在下述实施例中进行介绍,这里不再赘述。
54.s103,若是,输出用于表征该目标函数存在异常的报错信息。
55.可以理解的是,由于目标函数在执行发送rpc请求失败时,会自动触发请求的重试,因此,若目标函数被循环函数所调用,在执行发送rpc请求失败时,会在该循环函数中重新调用该目标函数,从而导致重试次数倍增。因此,若检测到目标函数被循环函数所调用,
则可以输出报错信息。
56.示例性的,在实际应用中,可以利用执行该程序代码的异常检测方法的工具对该目标程序代码进行检测,并将该输出的报错信息在该工具对应的前端界面中进行展示,使得相关工作人员可以在该前端界面中查看到该报错信息。进而,使得相关工作人员可以根据所输出的报错信息,对目标程序代码中所存在的重复的重试逻辑进行修改,从而降低目标程序代码中的rpc请求的请求重试次数。
57.示例性的,用于表征该目标函数存在异常的报错信息的内容可以包括:目标程序代码中该目标函数所处的位置,以及该目标函数存在异常的原因,例如:该目标函数不应该出现在for循环中,或者不应该存在for循环所调用函数的调用链中,等等。
58.本公开提供的方案中,由于目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数,该目标通信框架中封装有rpc请求的重试逻辑;因此,通过检测该目标函数是否被循环函数所调用,且在检测到目标函数被循环函数调用时,输出用表征目标函数存在异常的报错信息,可以找到导致重试次数倍增的代码,从而对导致重试次数倍增的代码进行报错。进而使得相关工作人员可以根据所输出的报错信息,对目标程序代码中所存在的重复的重试逻辑进行修改,从而降低目标程序代码中的rpc请求的请求重试次数。可见,通过本方案,可以对导致重试次数倍增的代码进行报错,进而使相关工作人员可以根据报错内容进行代码修改,从而解决重试次数的倍增问题。
59.可选地,在本公开的另一实施例中,如图2所示,检测该目标函数是否被该循环函数直接调用的方式,可以包括步骤s201-s203:
60.s201,确定在该目标程序代码中该目标函数所位于的基本块,作为第一基本块;
61.本领域普通技术人员可以知晓,在程序代码中,基本块是一个直线代码序列,除了入口没有分支,除了出口没有分支。也就是,基本块中的代码具有一个入口点,意味着基本块中没有代码是程序中任何地方的跳转指令的目的地;以及一个出口点,意味着基本块中只有最后一条指令代码可以使程序开始执行不同基本块中的代码。在这种情况下,无论何时执行一基本块中的第一条指令,该基本块中其余指令都必须按顺序恰好执行一次。
62.可选地,在一种实现方式中,确定在该目标程序代码中任一函数所位于的基本块的方式,可以包括:
63.利用预定工具包,对该目标程序代码中的任一函数所位于的基本块进行识别,得到该任一函数所位于的基本块。
64.本实现方式中,该预定工具包可以是go语言的ssa(static single assignment,静态单赋值)包。可以理解的是,ssa是一种高效的数据流分析技术,go语言中提供的ssa包可以将目标程序代码转换成ssa形式的中间代码。由于目标程序代码中对同一变量的不相关的若干次使用,在ssa形式的中间代码中会转变成对不同变量的使用,因此,可以消除目标程序代码中很多不必要的依赖关系,从而使各部分代码之间的代码逻辑关系更清晰。因此,利用go语言的ssa包对目标程序代码中的任一函数所位于的基本块进行识别,可以快速识别出该函数所位于的基本块。
65.基于该种实现方式,目标函数所位于的基本块的确定方式,可以包括:利用预定工具包,对该目标程序代码中的目标函数所位于的基本块进行识别,得到该目标函数所位于的第一基本块。
66.s202,识别该第一基本块是否位于该循环函数内部;
67.s203,若是,则该目标函数被该循环函数直接调用。
68.本实施例中,在通过步骤s201确定出第一基本块后,可以识别第一基本块是否位于循环函数内部。若该第一基本块位于该循环函数内部,则该目标函数位于该循环函数内部,也就是,该目标函数被循环函数直接调用。示例性的,若目标函数为do函数,且第一基本块中的代码如下:
69.res,err:=client.do()//响应失败进行rpc请求的重试
70.则若该第一基本块位于循环函数内部,则该目标函数被循环函数直接调用。
71.可见,通过本方案,可以检测出目标函数是否被循环函数直接调用。
72.可选地,在本公开的另一实施例中,如图3所示,检测该目标函数是否被该循环函数间接调用的方式,可以包括步骤s301-s303:
73.s301,确定在该目标程序代码中该循环函数所位于的基本块,作为第二基本块;
74.示例性的,在实际应用中,可以基于上述步骤s201中所描述的确定任一函数所位于的基本块的方式,确定在该目标程序代码中该循环函数所位于的第二基本块。即利用go语言的ssa包,对该目标程序代码中的该循环函数所位于的基本块进行识别,得到该循环函数所位于的第二基本块。
75.s302,确定该第二基本块中所存在的回调函数;
76.可以理解的是,由于第二基本块为循环函数所位于的基本块,若循环函数中所存在的回调函数调用了目标函数,则该目标函数被该循环函数间接调用;因此,为了识别目标函数是否被循环函数间接调用,可以先确定第二基本块中所存在的回调函数,然后通过遍历各个回调函数的调用链中是否存在目标函数,确定目标函数是否被该循环函数间接调用。
77.s303,在该目标程序代码中对该回调函数进行递归跟踪,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被该循环函数间接调用。
78.本实施例中,在目标程序代码中对该回调函数进行递归跟踪,也就是对该回调函数进行调用链跟踪,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被该循环函数间接调用。
79.示例性的,若循环函数为for循环,且第二基本块中的代码如下:
80.for i:=0;i《3;i++{
81.call(client)
82.}
83.则该第二基本块中的回调函数为call(client)函数。对该call(client)函数进行递归跟踪,若跟踪到该call(client)函数中调用了目标函数,则该目标函数被该循环函数间接调用。例如,若该call(client)函数的代码内容中包括“res,err:=client.do()”,则该回调函数调用了目标函数。此时,该for循环通过调用回调函数可以调用到该目标函数,因此该目标函数被该循环函数间接调用。
84.可选地,在一种实现方式中,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被循环函数间接调用之前,还可以包括:
85.监测该递归跟踪的递归深度;
86.本实现方式中,对该回调函数进行递归跟踪时还可以监测该递归跟踪的递归深度,从而后续在达到预设递归深度时若仍未跟踪到目标函数,则可以直接判断该目标函数未被循环函数间接调用。
87.相应地,在本实现方式中,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被该循环函数间接调用,可以包括:
88.在该递归深度小于该预设阈值时,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被循环函数间接调用。
89.示例性的,该预设阈值可以是2、3,等等。可以理解的是,在该递归深度小于该预设阈值时,若跟踪到该回调函数所调用的函数为目标函数,则该目标函数被循环函数间接调用,若未跟踪到目标函数则继续跟踪。并且,由于递归跟踪的递归深度过深会影响程序的执行性能,因此,若递归深度达到预设阈值时,仍未跟踪到目标函数,则可以结束该递归跟踪,从而在程序代码的检测过程中兼顾检测方法的执行性能。
90.可见,通过本方案,可以检测出目标函数是否被循环函数间接调用。
91.为了更好的理解本公开实施例的内容,下面结合一个具体的示例进行阐述。
92.在现代分布式系统中,使用微服务架构的各个服务之间通过rpc请求进行通信。由于网络等原因,服务之间的通信可能会存在超时、异常等情况。为了增强服务的健壮性,服务端往往会在接收到异常请求时返回特定的错误码,客户端则需要根据错误码进行相应的处理。其中,一种常见的处理方式是进行请求的重试,即重新向服务端发送请求,直到请求成功或达到一定的重试次数为止。
93.go语言中,存在封装有rpc请求的重试逻辑的通信框架easy。由于easy框架已经对rpc请求的重试逻辑进行了封装,因此在调用用于发送rpc请求的函数时,若该函数为基于easy框架的框架代码所生成的请求函数,则不应再进行请求的重试,以避免请求重试的次数倍增,导致下游服务压力增大,从而可能导致服务雪崩的情形。
94.针对上述问题,本示例提出了一种基于代码静态检测的解决方案,在代码静态检测阶段,检测基于easy框架的框架代码所生成的请求函数的上层函数中,是否存在对该请求函数的重试操作。在go语言中,对于请求重试这种场景,通常用for循环来实现。当执行因超时等原因导致rpc请求发送出错时,继续进入for循环,重新发送该rpc请求;当执行rpc请求发送成功时,跳出for循环。因此,在本示例中,只需要对于一些定义好的函数进行监听,判断该函数是否在for循环中进行了直接调用或者间接调用。若是,则对该重复的重试逻辑进行报错。
95.本示例依托于golang/analysis包(一个强大的静态分析工具)来实现,即实现一个analyzer静态分析工具,其中的编译方法用于实现代码静态检测逻辑。主要思路为监听已经定义好的函数,是否在for循环中进行了直接调用或者间接调用,若在for循环中进行了调用就进行报错。具体实现细节如下:
96.(1)监听的目标函数可以具有以下特点:
97.该函数为一个结构体的函数,例如client结构体的函数;
98.该结构体内嵌了easy.client结构体(对应于上文中的预设结构体),通过识别该内嵌的结构体中是否存在名称为"ufcclient"的结构体成员,可以确定该内嵌的结构体是否为easy.client结构体;
99.函数名称为do函数,作用是向下游服务发出请求。
100.可以理解的是,由于easy框架中,访问下游服务的函数为do函数,因此可以识别目标程序代码中的do函数,作为目标函数。do函数内部封装了重试逻辑,即对于访问超时的情形会自动重发请求来访问下游服务。
101.(2)对该目标函数是否被for循环(对应于上文中的循环函数)进行直接或间接调用进行判断。
102.a.判断该目标函数是否在for循环中进行了直接调用:
103.利用go语言的ssa包进行静态代码分析,获取该目标函数所在的ssa基本块(对应于上文中的第一基本块)。判断该ssa基本块是否为位于for循环中的基本块,若是,该目标函数被for循环直接调用。
104.b.判断该目标函数是否被for循环间接调用:
105.对于for循环所属的基本块(对应于上文中的第二基本块),遍历该基本块中的所有函数调用(对应于上文中的回调函数),对该函数调用进行递归跟踪。在不超过预设递归深度(这里设置为2)时,若跟踪到目标函数,就进行报错。
106.例如,针对一for循环所属的基本块,若该基本块中包括代码内容:“res,err:=client.do()”,其中,do函数为目标函数,因此,该目标函数被for循环直接调用;针对另一for循环所属的基本块,若该for循环中调用了call(client)函数,则对该函数调用进行递归跟踪,若跟踪到该call(client)函数的代码内容为:“res,err:=client.do()”,则该for循环通过函数调用可以调用到该目标函数,,因此该目标函数被该循环函数间接调用。
107.可见,通过本方案,可以检测特定框架的特定函数是否开启了重试,这里的特定函数是可以配置的,根据本方案,可以在静态阶段就能检测到是否存在重复的重试逻辑的问题。可用于ci/cd(持续集成/持续交付或持续部署)流水线中,作为其中的一个检测步骤,如果代码中出现重复的重试逻辑,就将其拦截。
108.基于上述程序代码的异常检测方法的实施例,本公开实施例还提供了一种程序代码的异常检测装置,如图4所示,所述装置包括:
109.识别模块410,用于识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;
110.检测模块420,用于基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;
111.输出模块430,用于若是,输出用于表征所述目标函数存在异常的报错信息。
112.可选地,所述内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数符合预定命名规则;
113.所述识别模型,具体用于:
114.遍历所述目标程序代码中的函数,若所遍历到的函数符合所述预定命名规则,将所遍历到的函数确定为目标函数。
115.可选地,所述预定命名规则包括:函数名称中包含有预设字符串。
116.可选地,所述检测模块,具体用于:
117.基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测
所述目标函数是否被所述循环函数直接调用或间接调用。
118.可选地,检测所述目标函数是否被所述循环函数直接调用的方式,包括:
119.确定在所述目标程序代码中所述目标函数所位于的基本块,作为第一基本块;
120.识别所述第一基本块是否位于所述循环函数内部;
121.若是,则所述目标函数被所述循环函数直接调用。
122.可选地,确定在所述目标程序代码中任一函数所位于的基本块的方式,包括:
123.利用预定工具包,对所述目标程序代码中的任一函数所位于的基本块进行识别,得到所述任一函数所位于的基本块。
124.可选地,检测所述目标函数是否被所述循环函数间接调用的方式,包括:
125.确定在所述目标程序代码中所述循环函数所位于的基本块,作为第二基本块;
126.确定所述第二基本块中所存在的回调函数;
127.在所述目标程序代码中对所述回调函数进行递归跟踪,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用。
128.可选地,所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用之前,还包括:
129.监测所述递归跟踪的递归深度;
130.所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用,包括:
131.在所述递归深度小于所述预设阈值时,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用。
132.本公开的技术方案中,所涉及的用户个人信息的收集、存储、使用、加工、传输、提供和公开等处理,均符合相关法律法规的规定,且不违背公序良俗。
133.根据本公开的实施例,本公开还提供了一种电子设备、一种可读存储介质和一种计算机程序产品。
134.本公开所提供的一种电子设备,可以包括:
135.至少一个处理器;以及
136.与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述任一程序代码的异常检测方法的步骤。
137.本公开所提供的一种计算机可读存储介质,该计算机可读存储介质内存储有计算机程序,所述计算机程序被处理器执行时实现上述任一程序代码的异常检测方法的步骤。
138.在本公开提供的又一实施例中,还提供了一种包含指令的计算机程序产品,当其在计算机上运行时,使得计算机执行上述实施例中任一程序代码的异常检测方法的步骤。
139.图5示出了可以用来实施本公开的实施例的示例电子设备500的示意性框图。电子设备旨在表示各种形式的数字计算机,诸如,膝上型计算机、台式计算机、工作台、个人数字助理、服务器、刀片式服务器、大型计算机、和其它适合的计算机。电子设备还可以表示各种形式的移动装置,诸如,个人数字处理、蜂窝电话、智能电话、可穿戴设备和其它类似的计算装置。本文所示的部件、它们的连接和关系、以及它们的功能仅仅作为示例,并且不意在限制本文中描述的和/或者要求的本公开的实现。
140.如图5所示,设备500包括计算单元501,其可以根据存储在只读存储器(rom)502中的计算机程序或者从存储单元508加载到随机访问存储器(ram)503中的计算机程序,来执行各种适当的动作和处理。在ram 503中,还可存储设备500操作所需的各种程序和数据。计算单元501、rom 502以及ram 503通过总线504彼此相连。输入/输出(i/o)接口505也连接至总线504。
141.设备500中的多个部件连接至i/o接口505,包括:输入单元506,例如键盘、鼠标等;输出单元507,例如各种类型的显示器、扬声器等;存储单元508,例如磁盘、光盘等;以及通信单元509,例如网卡、调制解调器、无线通信收发机等。通信单元509允许设备500通过诸如因特网的计算机网络和/或各种电信网络与其他设备交换信息/数据。
142.计算单元501可以是各种具有处理和计算能力的通用和/或专用处理组件。计算单元501的一些示例包括但不限于中央处理单元(cpu)、图形处理单元(gpu)、各种专用的人工智能(ai)计算芯片、各种运行机器学习模型算法的计算单元、数字信号处理器(dsp)、以及任何适当的处理器、控制器、微控制器等。计算单元501执行上文所描述的各个方法和处理,例如程序代码的异常检测方法。例如,在一些实施例中,程序代码的异常检测方法可被实现为计算机软件程序,其被有形地包含于机器可读介质,例如存储单元508。在一些实施例中,计算机程序的部分或者全部可以经由rom 502和/或通信单元509而被载入和/或安装到设备500上。当计算机程序加载到ram 503并由计算单元501执行时,可以执行上文描述的程序代码的异常检测方法的一个或多个步骤。备选地,在其他实施例中,计算单元501可以通过其他任何适当的方式(例如,借助于固件)而被配置为执行程序代码的异常检测方法。
143.本文中以上描述的系统和技术的各种实施方式可以在数字电子电路系统、集成电路系统、场可编程门阵列(fpga)、专用集成电路(asic)、专用标准产品(assp)、芯片上系统的系统(soc)、复杂可编程逻辑设备(cpld)、计算机硬件、固件、软件、和/或它们的组合中实现。这些各种实施方式可以包括:实施在一个或者多个计算机程序中,该一个或者多个计算机程序可在包括至少一个可编程处理器的可编程系统上执行和/或解释,该可编程处理器可以是专用或者通用可编程处理器,可以从存储系统、至少一个输入装置、和至少一个输出装置接收数据和指令,并且将数据和指令传输至该存储系统、该至少一个输入装置、和该至少一个输出装置。
144.用于实施本公开的方法的程序代码可以采用一个或多个编程语言的任何组合来编写。这些程序代码可以提供给通用计算机、专用计算机或其他可编程数据处理装置的处理器或控制器,使得程序代码当由处理器或控制器执行时使流程图和/或框图中所规定的功能/操作被实施。程序代码可以完全在机器上执行、部分地在机器上执行,作为独立软件包部分地在机器上执行且部分地在远程机器上执行或完全在远程机器或服务器上执行。
145.在本公开的上下文中,机器可读介质可以是有形的介质,其可以包含或存储以供指令执行系统、装置或设备使用或与指令执行系统、装置或设备结合地使用的程序。机器可读介质可以是机器可读信号介质或机器可读储存介质。机器可读介质可以包括但不限于电子的、磁性的、光学的、电磁的、红外的、或半导体系统、装置或设备,或者上述内容的任何合适组合。机器可读存储介质的更具体示例会包括基于一个或多个线的电气连接、便携式计算机盘、硬盘、随机存取存储器(ram)、只读存储器(rom)、可擦除可编程只读存储器(eprom或快闪存储器)、光纤、便捷式紧凑盘只读存储器(cd-rom)、光学储存设备、磁储存设备、或
上述内容的任何合适组合。
146.为了提供与用户的交互,可以在计算机上实施此处描述的系统和技术,该计算机具有:用于向用户显示信息的显示装置(例如,crt(阴极射线管)或者lcd(液晶显示器)监视器);以及键盘和指向装置(例如,鼠标或者轨迹球),用户可以通过该键盘和该指向装置来将输入提供给计算机。其它种类的装置还可以用于提供与用户的交互;例如,提供给用户的反馈可以是任何形式的传感反馈(例如,视觉反馈、听觉反馈、或者触觉反馈);并且可以用任何形式(包括声输入、语音输入或者、触觉输入)来接收来自用户的输入。
147.可以将此处描述的系统和技术实施在包括后台部件的计算系统(例如,作为数据服务器)、或者包括中间件部件的计算系统(例如,应用服务器)、或者包括前端部件的计算系统(例如,具有图形用户界面或者网络浏览器的用户计算机,用户可以通过该图形用户界面或者该网络浏览器来与此处描述的系统和技术的实施方式交互)、或者包括这种后台部件、中间件部件、或者前端部件的任何组合的计算系统中。可以通过任何形式或者介质的数字数据通信(例如,通信网络)来将系统的部件相互连接。通信网络的示例包括:局域网(lan)、广域网(wan)和互联网。
148.计算机系统可以包括客户端和服务器。客户端和服务器一般远离彼此并且通常通过通信网络进行交互。通过在相应的计算机上运行并且彼此具有客户端-服务器关系的计算机程序来产生客户端和服务器的关系。服务器可以是云服务器,也可以为分布式系统的服务器,或者是结合了区块链的服务器。
149.应该理解,可以使用上面所示的各种形式的流程,重新排序、增加或删除步骤。例如,本公开中记载的各步骤可以并行地执行也可以顺序地执行也可以不同的次序执行,只要能够实现本公开公开的技术方案所期望的结果,本文在此不进行限制。
150.上述具体实施方式,并不构成对本公开保护范围的限制。本领域技术人员应该明白的是,根据设计要求和其他因素,可以进行各种修改、组合、子组合和替代。任何在本公开的精神和原则之内所作的修改、等同替换和改进等,均应包含在本公开保护范围之内。
技术特征:
1.一种程序代码的异常检测方法,包括:识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;若是,输出用于表征所述目标函数存在异常的报错信息。2.根据权利要求1所述的方法,其中,所述内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数符合预定命名规则;所述识别目标程序代码中的目标函数,包括:遍历所述目标程序代码中的函数,若所遍历到的函数符合所述预定命名规则,将所遍历到的函数确定为目标函数。3.根据权利要求2所述的方法,其中,所述预定命名规则包括:函数名称中包含有预设字符串。4.根据权利要求1-3任一项所述的方法,其中,所述基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用,包括:基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数直接调用或间接调用。5.根据权利要求4所述的方法,其中,检测所述目标函数是否被所述循环函数直接调用的方式,包括:确定在所述目标程序代码中所述目标函数所位于的基本块,作为第一基本块;识别所述第一基本块是否位于所述循环函数内部;若是,则所述目标函数被所述循环函数直接调用。6.根据权利要求5所述的方法,其中,确定在所述目标程序代码中任一函数所位于的基本块的方式,包括:利用预定工具包,对所述目标程序代码中的任一函数所位于的基本块进行识别,得到所述任一函数所位于的基本块。7.根据权利要求4所述的方法,其中,检测所述目标函数是否被所述循环函数间接调用的方式,包括:确定在所述目标程序代码中所述循环函数所位于的基本块,作为第二基本块;确定所述第二基本块中所存在的回调函数;在所述目标程序代码中对所述回调函数进行递归跟踪,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用。8.根据权利要求7所述的方法,其中,所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用之前,还包括:监测所述递归跟踪的递归深度;所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用,包括:
在所述递归深度小于所述预设阈值时,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用。9.一种程序代码的异常检测装置,包括:识别模块,用于识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数;所述目标通信框架中封装有rpc请求的重试逻辑;检测模块,用于基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;输出模块,用于若是,输出用于表征所述目标函数存在异常的报错信息。10.根据权利要求9所述的装置,其中,所述内嵌有目标通信框架的预设结构体、且在执行时用于发送rpc请求的函数符合预定命名规则;所述识别模块,具体用于:遍历所述目标程序代码中的函数,若所遍历到的函数符合所述预定命名规则,将所遍历到的函数确定为目标函数。11.根据权利要求10所述的装置,其中,所述预定命名规则包括:函数名称中包含有预设字符串。12.根据权利要求9-11任一项所述的装置,其中,所述检测模块,具体用于:基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数直接调用或间接调用。13.根据权利要求12所述的装置,其中,检测所述目标函数是否被所述循环函数直接调用的方式,包括:确定在所述目标程序代码中所述目标函数所位于的基本块,作为第一基本块;识别所述第一基本块是否位于所述循环函数内部;若是,则所述目标函数被所述循环函数直接调用。14.根据权利要求13所述的装置,其中,确定在所述目标程序代码中任一函数所位于的基本块的方式,包括:利用预定工具包,对所述目标程序代码中的任一函数所位于的基本块进行识别,得到所述任一函数所位于的基本块。15.根据权利要求12所述的装置,其中,检测所述目标函数是否被所述循环函数间接调用的方式,包括:确定在所述目标程序代码中所述循环函数所位于的基本块,作为第二基本块;确定所述第二基本块中所存在的回调函数;在所述目标程序代码中对所述回调函数进行递归跟踪,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用。16.根据权利要求15所述的装置,其中,所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用之前,还包括:监测所述递归跟踪的递归深度;所述若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被所述循环函数间接调用,包括:
在所述递归深度小于所述预设阈值时,若跟踪到所述回调函数所调用的函数为目标函数,则所述目标函数被循环函数间接调用。17.一种电子设备,包括:至少一个处理器;以及与所述至少一个处理器通信连接的存储器;其中,所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行权利要求1-8中任一项所述的方法。18.一种存储有计算机指令的非瞬时计算机可读存储介质,其中,所述计算机指令用于使所述计算机执行根据权利要求1-8中任一项所述的方法。19.一种计算机程序产品,包括计算机程序,所述计算机程序在被处理器执行时实现根据权利要求1-8中任一项所述的方法。
技术总结
本公开提供了一种程序代码的异常检测方法、装置、设备以及存储介质,涉及计算机技术领域,尤其涉及代码测试、漏洞挖掘和软件安全等技术领域。具体实现方案为:识别目标程序代码中的目标函数;其中,所述目标函数为内嵌有目标通信框架的预设结构体、且在执行时用于发送RPC请求的函数;所述目标通信框架中封装有RPC请求的重试逻辑;基于所述目标函数与所述目标程序代码中的循环函数之间的代码逻辑关系,检测所述目标函数是否被所述循环函数所调用;若是,输出用于表征所述目标函数存在异常的报错信息。可见,通过本方案,可以对导致重试次数倍增的代码进行报错,进而使相关工作人员可以根据报错内容进行代码修改,从而解决重试次数的倍增问题。倍增问题。倍增问题。
技术研发人员:钟真炎
受保护的技术使用者:北京百度网讯科技有限公司
技术研发日:2023.06.30
技术公布日:2023/10/15
版权声明
本文仅代表作者观点,不代表航空之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
飞行汽车 https://www.autovtol.com/
