本技术涉及软件,尤其涉及一种确定代码异常的方法及装置。
背景技术:
1、程序(program)包括的代码可分为正常功能代码和异常处理代码。正常功能代码用于实现程序对外提供的功能。异常处理代码用于处理正常功能代码运行产生的异常情况,提高程序运行的稳定性,例如,异常处理代码可用于处理程序运行过程中的内存分配失败、网络连接中断和用户非法输入等异常情况。在程序正式投入使用之前,一般需要对程序进行检测,以便及时更正程序存在的问题。对程序的检测包括对正常功能代码检测、以及对异常处理代码检测。
2、对异常处理代码进行检测的一般方式为:在正常功能代码中注入异常,触发程序中的异常处理代码运行,确定异常处理代码是否能够处理被注入的异常。如果异常处理代码能够处理被注入的异常,那么确定异常处理代码正常;如果异常处理代码无法处理被注入的异常,那么确定异常处理异常。这种检测异常处理代码的方式侧重于检查异常处理代码的基本功能,但可能无法发现异常处理代码的并发问题。并发问题是指运行异常处理代码的线程和其他并发的线程对数据的操作存在并发冲突,例如,运行异常处理代码的线程在其它并发的线程锁定数据的情况下,非法访问了该数据。在异常处理代码存在并发问题的情况下,异常处理代码处理依旧可处理被注入的异常。但在程序正式投入使用之后,非法分子可利用异常处理代码存在的并发问题攻击程序,这可能会造成程序出现更为严重的问题。由此可见,如何检测异常处理代码的并发问题是亟需解决的问题。
技术实现思路
1、本技术实施例提供一种确定代码异常的方法及装置,用于提供一种检测异常处理代码的并发问题的方式。
2、第一方面,本技术实施例提供一种确定异常处理代码的方法,该方法可由确定异常处理代码的装置执行。该装置例如为计算设备、计算设备中的软件模块(如应用)、或计算设备中的硬件模块(如芯片)等。计算设备例如为服务器或终端设备。所述方法包括:获取异常处理代码,所述异常处理代码用于处理程序中的正常功能代码运行产生的异常情况;并发执行第一线程和第二线程,所述第一线程用于执行所述异常处理代码中的第一部分代码,所述第二线程用于执行所述正常功能代码中的第二部分代码,所述第二线程与所述第一线程存在共享变量,所述共享变量为被所述第一线程和所述第二线程在不同的时间段访问的代码;若所述第一线程和所述第二线程对所述共享变量存在操作冲突,则确定所述异常处理代码存在异常。
3、在本技术实施例中,可检测第一线程和第二线程对共享变量的访问情况,确定异常处理代码是否存在异常,提供了一种检测异常处理代码的并发问题的方式,有利于更全面地对异常处理代码进行检测。并且,联合运行异常处理代码的第一线程,以及运行正常功能代码的第二线程操作共享变量的情况,检测异常处理代码的异常,而不是独立地检测异常处理代码的异常,这使得检测异常处理代码过程与程序被投入使用后的运行过程更为接近,有利于更准确地检测异常处理代码的异常。并且,由于存在共享变量的多个线程出现并发问题的可能性更大,因此本技术实施例中根据第一线程、以及与第一线程并发执行且存在共享变量的第二线程的情况检测异常处理代码的并发问题,有利于提高异常处理代码暴露并发问题的概率,从而更准确地检测异常处理代码是否存在并发问题。
4、在一种可能的实施方式中,所述第一线程和所述第二线程对所述共享变量存在操作冲突,包括:在所述共享变量处于第一状态下,所述第一线程对所述共享变量进行访问操作,所述第一状态是指所述共享变量被所述第二线程独占;或者在所述第一线程对内存中的所述共享变量进行删除操作之后,所述第二线程对所述内存进行访问操作;或者所述第一线程和所述第二线程在第一预设时长内均对内存中的所述共享变量进行删除操作。
5、在上述实施方式中,可检测第一线程和第二线程对共享变量存在操作冲突的多种情况,有利于对异常处理代码存在的并发问题进行相对全面的检测。并且,可分析第一线程和第二线程对共享变量的操作情况,确定异常处理代码是否存在异常,而不必对程序运行的各方面的信息进行分析,这有利于减少确定异常处理代码异常的数据分析量,也就提高了检测异常处理代码的异常的针对性。
6、在一种可能的实施方式中,在所述第二线程访问所述共享变量之后,暂停执行所述第二线程,其中,在所述第二线程暂停执行的情况下,所述共享变量处于第一状态,所述第一状态是指所述共享变量被所述第二线程独占;在第二预设时长之后,或者在所述第一线程执行结束之后,再恢复执行所述第二线程。
7、在上述实施方式中,在第二线程访问共享变量之后,可将第二线程设置为挂起状态(即第二线程暂停执行,但第二线程依旧独占共享变量),如此,相当于延长了第二线程占用共享变量的时长,提高了第一线程在第二线程独占共享变量的情况下,操作共享变量的概率,也就有利于暴露异常处理代码的异常,有利于更准确地对异常处理代码进行检测。
8、在一种可能的实施方式中,所述第二线程与所述第一线程存在共享变量,包括:所述第一部分代码中的所述共享变量的结构体类型与所述第二部分代码中的所述共享变量的结构体类型相同,以及所述第一部分代码中的所述共享变量对应的函数与所述第二部分代码中的所述共享变量对应的函数的名称不同;和/或,所述第一线程和所述第二线程均在第三预设时长内访问所述共享变量。
9、在上述实施方式中,提供了检测第一线程和第二线程存在共享变量的几种方式,丰富了确定共享变量的方式。例如,可分析第一部分代码和第二部分代码的内容,确定第一线程和第二线程是否存在共享变量,相当于静态分析程序中的代码,确定第一线程和第二线程是否存在共享变量,从而无需在运行过程中判断是否存在共享变量,有利于减少程序运行过程中的资源开销。又例如,可以根据第一线程和第二线程的运行信息,分析第一线程和第二线程是否均在第三预设时长内访问共享变量,从而提高检测第一线程和第二线程存在共享变量的结果的准确性。又例如,可通过分析第一部分代码和第二部分代码,以及根据第一线程和第二线程访问共享变量的情况,确定第一线程和第二线程是否存在共享变量,如此,利于提高检测第一线程和第二线程存在共享变量的结果的准确性。
10、在一种可能的实施方式中,在并发执行第一线程和第二线程之前,所述方法还包括:执行第三线程,所述第三线程用于执行所述正常功能代码中的第三部分代码;更改所述第三部分代码中的目标函数调用的返回值,以使所述第一线程执行所述第一部分代码,所述目标函数用于触发所述第一线程执行所述第一部分代码。可选的,目标函数可以被预存在用于确定代码异常的装置中。
11、在上述实施方式中,可在运行的正常功能代码的目标函数中注入异常(例如修改目标函数调用的返回值),触发第一线程执行第一部分代码,也就触发了异常处理代码的运行。如此,提供了一种触发运行异常处理代码的方式。并且,在正常功能代码运行过程中注入异常,可无需提前注入异常,有利于提高检测代码异常的效率。
12、在一种的可能的实施方式中,所述方法还包括:记录所述目标函数在所述第三部分代码中的位置,和/或所述目标函数对应的函数调用栈。
13、在上述实施方式中,可以记录目标函数的位置以及对应的函数调用栈,可为下一次测试异常处理代码提供数据基础,从而避免对目标函数触发第一线程的情况进行重复测试,或者避免重复对目标函数进行异常注入。
14、第二方面,本技术实施例提供一种确定异常处理代码的方法,该方法可由确定异常处理代码的装置执行。该装置例如为计算设备、计算设备中的软件模块(如应用)、或计算设备中的硬件模块(如芯片)等。计算设备例如为服务器或终端设备。所述方法包括:获取异常处理代码,所述异常处理代码用于处理程序运行产生的异常情况;并发执行第一线程和第二线程,所述第一线程用于执行所述异常处理代码中的第一部分代码,所述第二线程用于执行所述异常处理代码中的第二部分代码,所述第二线程与所述第一线程存在共享变量,所述共享变量为被所述第一线程和所述第二线程在不同的时间段访问的代码;若所述第一线程和所述第二线程对所述共享变量存在操作冲突,则确定所述异常处理代码存在异常。
15、在本技术实施例中,可根据第一线程和第二线程对共享变量的操作情况,确定异常处理代码是否存在并发问题,提供了一种检测异常处理代码的并发问题的方式。并且,由于存在共享变量的并发线程执行暴露问题的可能性更大,因此根据并发执行的多个线程对共享变量操作的情况,检测异常处理代码的并发问题,有利于更有针对性地检测异常处理代码的异常。并且,第一线程和第二线程均用于执行异常处理代码,相当于可以一次性对异常处理代码中更多的代码进行检测,有利于提高检测异常处理代码的效率。
16、在一种可能的实施方式中,所述第一线程和所述第二线程对所述共享变量存在操作冲突,包括:在所述共享变量处于第一状态下,所述第一线程对所述共享变量进行访问操作,所述第一状态是指所述共享变量被所述第二线程独占;或者在所述第一线程对内存中的所述共享变量进行删除操作之后,所述第二线程对所述内存进行访问操作;或者所述第一线程和所述第二线程在第一预设时长内均对内存中的所述共享变量进行删除操作。
17、在一种可能的实施方式中,在并发执行第一线程和第二线程之后,所述方法还包括:在所述第二线程访问所述共享变量之后,暂停执行所述第二线程,其中,在所述第二线程暂停执行的情况下,所述共享变量处于第一状态,所述第一状态是指所述共享变量被所述第二线程独占;在第二预设时长之后,或者在所述第一线程执行结束之后,再恢复执行所述第二线程。
18、在一种可能的实施方式中,所述第二线程与所述第一线程存在共享变量,包括:所述第一部分代码中的所述共享变量的结构体类型与所述第二部分代码中的所述共享变量的结构体类型相同,以及所述第一部分代码中的所述共享变量对应的函数与所述第二部分代码中的所述共享变量对应的函数的名称不同;和/或,所述第一线程和所述第二线程均在第三预设时长内访问所述共享变量。
19、在一种可能的实施方式中,在并发执行第一线程和第二线程之前,所述方法还包括:执行第三线程,所述第三线程用于执行所述程序中的正常功能代码中的第三部分代码;更改所述第三部分代码中的第一函数调用的返回值,以使所述第一线程执行所述第一部分代码,以及更改所述第三部分代码中的第二函数调用的返回值,以使所述第二线程执行所述第二部分代码,所述第一函数用于触发所述第一线程执行所述第一部分代码,所述第二函数用于触发所述第二线程执行所述第二部分代码。
20、在一种的可能的实施方式中,所述方法还包括:记录所述第一函数在所述第三部分代码中的位置,和/或对应的函数调用栈;和/或,记录所述第二函数在所述第三部分代码中的位置,和/或对应的函数调用栈。
21、第三方面,本技术实施例提供一种确定异常处理代码的装置,该通信装置可以为上述第一方面及任一可能的实施方式中的确定异常处理代码的装置,或者为配置在确定异常处理代码的装置的软件模块或硬件模块(如芯片)。该确定异常处理代码的装置包括用于执行上述第一方面或任一可能的实施方式的相应的手段(means)或模块。例如,该确定异常处理代码的装置包括测试管理模块(有时也称为测试管理单元),以及动态检测模块(有时也称为动态检测单元)。
22、例如,测试管理模块,用于获取异常处理代码,所述异常处理代码用于处理程序中的正常功能代码运行产生的异常情况,以及并发执行第一线程和第二线程,所述第一线程用于执行所述异常处理代码中的第一部分代码,所述第二线程用于执行所述正常功能代码中的第二部分代码,所述第二线程与所述第一线程存在共享变量,所述共享变量为被所述第一线程和所述第二线程在不同的时间段访问的代码;动态检测模块,用于若所述第一线程和所述第二线程对所述共享变量存在操作冲突,则确定所述异常处理代码存在异常。
23、在一种可能的实施方式中,所述第一线程和所述第二线程对所述共享变量存在操作冲突,包括:在所述共享变量处于第一状态下,所述第一线程对所述共享变量进行访问操作,所述第一状态是指所述共享变量被所述第二线程独占;或者在所述第一线程对内存中的所述共享变量进行删除操作之后,所述第二线程对所述内存进行访问操作;或者所述第一线程和所述第二线程在第一预设时长内均对内存中的所述共享变量进行删除操作。
24、在一种可能的实施方式中,所述测试管理模块还用于:在并发执行第一线程和第二线程之后,在所述第二线程访问所述共享变量之后,暂停执行所述第二线程,其中,在所述第二线程暂停执行的情况下,所述共享变量处于第一状态,所述第一状态是指所述共享变量被所述第二线程独占;在第二预设时长之后,或者在所述第一线程执行结束之后,恢复执行所述第二线程。
25、在一种可能的实施方式中,所述第二线程与所述第一线程存在共享变量,包括:所述第一部分代码中的所述共享变量的结构体类型与所述第二部分代码中的所述共享变量的结构体类型相同,以及所述第一部分代码中的所述共享变量对应的函数与所述第二部分代码中的所述共享变量对应的函数的名称不同;和/或,所述第一线程和所述第二线程均在第三预设时长内访问所述共享变量。
26、在一种可能的实施方式中,所述装置还包括代码插桩模块,所述代码插桩模块用于:在并发执行第一线程和第二线程之前,执行第三线程,所述第三线程用于执行所述正常功能代码中的第三部分代码;更改所述第三部分代码中的目标函数调用的返回值,以使所述第一线程执行所述第一部分代码,所述目标函数用于触发所述第一线程执行所述第一部分代码。
27、在一种可能的实施方式中,所述代码插桩模块还用于:记录所述目标函数在所述第三部分代码中的位置,和/或所述目标函数对应的函数调用栈。
28、第四方面,本技术实施例提供一种确定异常处理代码的装置,该通信装置可以为上述第二方面及任一可能的实施方式中的确定异常处理代码的装置,或者为配置在确定异常处理代码的装置的软件模块或硬件模块(如芯片)。该确定异常处理代码的装置包括用于执行上述第二方面或任一可能的实施方式的相应的手段(means)或模块。例如,该确定异常处理代码的装置包括测试管理模块(有时也称为测试管理单元),以及动态检测模块(有时也称为动态检测单元)。
29、例如,测试管理模块,用于获取异常处理代码,所述异常处理代码用于处理程序运行产生的异常情况,以及并发执行第一线程和第二线程,所述第一线程用于执行所述异常处理代码中的第一部分代码,所述第二线程用于执行所述异常处理代码中的第二部分代码,所述第二线程与所述第一线程存在共享变量,所述共享变量为被所述第一线程和所述第二线程在不同的时间段访问的代码;动态检测模块,用于若所述第一线程和所述第二线程对所述共享变量存在操作冲突,则确定所述异常处理代码存在异常。
30、在一种可能的实施方式中,所述第一线程和所述第二线程对所述共享变量存在操作冲突,包括:在所述共享变量处于第一状态下,所述第一线程对所述共享变量进行访问操作,所述第一状态是指所述共享变量被所述第二线程独占;或者在所述第一线程对内存中的所述共享变量进行删除操作之后,所述第二线程对所述内存进行访问操作;或者所述第一线程和所述第二线程在第一预设时长内均对内存中的所述共享变量进行删除操作。
31、在一种可能的实施方式中,所述测试管理模块还用于:在并发执行第一线程和第二线程之后,以及在所述第二线程访问所述共享变量之后,暂停执行所述第二线程,其中,在所述第二线程暂停执行的情况下,所述共享变量处于第一状态,所述第一状态是指所述共享变量被所述第二线程独占;在第二预设时长之后,或者在所述第一线程执行结束之后,再恢复执行所述第二线程。
32、在一种可能的实施方式中,所述第二线程与所述第一线程存在共享变量,包括:所述第一部分代码中的所述共享变量的结构体类型与所述第二部分代码中的所述共享变量的结构体类型相同,以及所述第一部分代码中的所述共享变量对应的函数与所述第二部分代码中的所述共享变量对应的函数的名称不同;和/或,所述第一线程和所述第二线程均在第三预设时长内访问所述共享变量。
33、在一种可能的实施方式中,所述装置还包括代码插桩模块,所述代码插桩模块用于:在并发执行第一线程和第二线程之前,执行第三线程,所述第三线程用于执行所述程序中的正常功能代码中的第三部分代码;更改所述第三部分代码中的第一函数调用的返回值,以使所述第一线程执行所述第一部分代码,以及更改所述第三部分代码中的第二函数调用的返回值,以使所述第二线程执行所述第二部分代码,所述第一函数用于触发所述第一线程执行所述第一部分代码,所述第二函数用于触发所述第二线程执行所述第二部分代码。
34、在一种可能的实施方式中,所述代码插桩模块还用于:记录所述目标函数在所述第三部分代码中的位置,和/或所述目标函数对应的函数调用栈。
35、第五方面,本技术实施例提供一种计算设备,包括:处理器和存储器;所述存储器用于存储一个或多个计算机程序,所述一个或多个计算机程序包括计算机执行指令,当所述通信装置运行时,所述处理器执行所述存储器存储的所述一个或多个计算机程序,以使得所述通信装置执行第一方面及任一可能的实施方式中或第二方面及任一可能的实施方式中的任一项所述的方法。
36、可选的,该通信装置还包括其他部件,例如,天线,输入输出模块或接口等。这些部件可以是硬件,软件,或者软件和硬件的结合。
37、第六方面,本技术实施例提供一种计算设备集群,包括至少一个计算设备,每个计算设备包括处理器和存储器;所述至少一个计算设备的处理器用于执行所述至少一个计算设备的存储器中存储的指令,以使得所述计算设备集群执行如第一方面及任一可能的实施方式中或第二方面及任一可能的实施方式中的任一项所述的方法。
38、第七方面,本技术实施例提供一种计算机可读存储介质,该计算机可读存储介质用于存储计算机程序或指令,当其被运行时,实现上述第一方面及任一可能的实施方式中或第二方面及任一可能的实施方式中的任一项所述的方法。
39、第八方面,本技术实施例提供一种包含指令的计算机程序产品,当其在计算机上运行时,实现第一方面及任一可能的实施方式中或第二方面及任一可能的实施方式中的任一项所述的方法。
40、关于上述第二方面至第八方面中任一技术方案的有益效果,可参照第一方面中的对应技术方案的有益效果论述,重复之处此处不再列举。