发明内容
针对上述技术问题,本申请提供一种冗余代码检测方法及装置,技术方案如下:
根据本申请的第一方面,提供一种冗余代码检测方法,应用于服务器端,该方法包括:
接收客户端发送的针对目标文件的下载请求;
将所述目标文件的布点版本文件提供给所述客户端,以响应所述下载请求;
接收客户端上传的所述目标文件的代码执行统计结果,所述代码执行统计结果通过执行所述布点版本文件得到;
对所述目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为所述目标文件的冗余代码。
根据本申请的第二方面,提供一种冗余代码检测方法,该方法包括:
客户端向服务器端发送针对目标文件的下载请求;
服务器端接收所述下载请求,将所述目标文件的布点版本文件提供给所述客户端,以响应所述下载请求;
客户端将执行所述布点版本文件后得到的代码执行统计结果上传至所述服务器端;
服务器端接收客户端上传的所述目标文件的代码执行统计结果;对所述目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为所述目标文件的冗余代码。
根据本申请的第三方面,提供一种冗余代码检测装置,应用于服务器端,该装置包括:
下载请求接收模块,用于接收客户端发送的针对目标文件的下载请求;
下载请求响应模块,用于将所述目标文件的布点版本文件提供给所述客户端,以响应所述下载请求;
统计结果接收模块,用于接收客户端上传的所述目标文件的代码执行统计结果,所述代码执行统计结果通过执行所述布点版本文件得到;
冗余代码分析模块,用于对所述目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为所述目标文件的冗余代码。
根据本申请的第四方面,提供一种冗余代码检测系统,该系统包括客户端装置及服务器端装置:
客户端装置向服务器端装置发送针对目标文件的下载请求;
服务器端装置接收所述下载请求,将所述目标文件的布点版本文件提供给所述客户端装置,以响应所述下载请求;
客户端装置将执行所述布点版本文件后得到的代码执行统计结果上传至所述服务器端装置;
服务器端装置接收客户端装置上传的所述目标文件的代码执行统计结果;对所述目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为所述目标文件的冗余代码。
本申请实施例所提供的技术方案,首先将冗余代码的检测任务通过网络分发到多个客户端执行,然后通过收集各个客户端的代码执行统计结果,做交集分析后确定冗余代码,与仅在开发端本地做冗余代码检测的方案相比,本申请方案利用互联网用户数量庞大的特点,有效地实现了冗余代码检测场景的全面覆盖。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,并不能限制本申请。
具体实施方式
利用布点转换检测冗余代码的方案,可以较好地检测出一段独立逻辑程序代码的冗余内容,然而在一段代码中包含多种逻辑的情况下,则需要保证这些被充分触发执行。然而在实际应用中,各种触发条件是难以事先预知并穷举的,以网络应用环境为例:同一个页面所引用的程序代码文件,针对不同用户可能需要展示不同的界面、执行不同的处理逻辑;而一个程序代码文件也可能会被多个页面引用并且分别执行不同的功能。对于检测方而言,这些动态因素往往是无法预先确定的,如果不能确保场景覆盖全面,则会导致将有用代码识别为冗余代码。
针对上述问题,本申请提出的方案是,针对一段待检测的目标代码,将用于冗余代码检测的代码执行统计任务通过网络分发给多个客户端,然后通过收集各个客户端的代码执行统计结果,做交集分析后确定冗余代码。由于开发网络应用原本就是给用户使用的,因此在用户使用过程中自然会触发各种场景,结合互联网内庞大的用户数量,可以有效地保证各种场景均被覆盖。
为了使本领域技术人员更好地理解本申请中的技术方案,下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行详细地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员所获得的所有其他实施例,都应当属于本申请保护的范围。
下面首先对本申请方案的运行系统架构进行说明。参见图1所示,本申请方案的冗余代码检测系统包括通过网络连接的服务器端100和多个客户端200,待检测的程序代码以文件的形式存储在服务器端100中,在本申请中称为目标文件。除原版的目标文件之外,在服务器端100中还存储有目标文件的布点版本文件,布点版本文件通过对原版目标文件进行处理得到,以一段JavaScript代码为例:
以下代码
if(a){alert(1);}
会被转换成
if(a){cov.branches[1]++;cov.statements[2]++;alert(1);}else{cov.branches[2]++;}
其中if(a)里的a是语句,alert(1)也是语句,所以在alert(1)之前会被加入cov.statements[2]++表示第二条语句被执行了,if(a){}里有一个分支,然后被补充上一个else的分支,并分别插入cov.branches的布点,这样就可以覆盖到所有分支的统计。
当然,上述例子仅用于简单示意性说明,不同的编程语言、不同的语句都具有各自的转换规则,具体的布点转换实现方式与本申请方案无关,在本申请中不做详细描述。
当客户端100访问页面时,如果该页面中引用了某个程序代码文件,则客户端100需要向服务器端100请求下载该文件,在本申请方案中,服务器端100会将该文件的布点版本提供给客户端100,这样客户端100就可以在执行程序的过程中,记录下那些代码被执行过,从而为服务器端100提供冗余代码分析样本。
图2所示为本申请提供的冗余代码检测方法交互流程图,该方法可以包括以下步骤:
S101,客户端向服务器端发送针对目标文件的下载请求;
当客户端访问某个页面时,首先获取该页面的HTML文件,浏览器在解析HTML文件的过程中,如果发现该页面引用了程序代码文件,例如a.js,则会根据该引用字段给出的URL,向URL指向的服务器发送针对a.js文件的下载请求。
S102,服务器端接收下载请求,将目标文件的布点版本文件提供给客户端。
按照常规的应用交互流程,服务器端应该根据客户端发送的下载请求,将请求的文件直接提供给客户端。而根据本申请的方案,服务器端会将所请求文件的布点版本文件提供给客户端,以响应文件下载请求。
例如,客户端请求下载文件a.js,假设该文件的布点版本文件为a0.js,则服务器端会将a0.js提供给客户端。
一般而言,布点版本文件是预先转换并存储于服务器端,并且在服务器端存储有各个原版文件和布点版本文件的对应关系信息。服务器端接收到文件下载请求后,通过查询对应关系信息,就可以确定该文件对应的布点版本文件。当然,在某些特定应用场景下,服务器也可以在接收到文件下载请求后再针对所请求的文件进行布点转换,然后将转换结果提供给客户端。
S103,客户端执行布点版本文件,得到代码执行统计结果;
从应用功能的角度看,布点版本的文件能够实现和原版文件相同的功能,并且在此基础上增加了代码执行统计的功能,因此尽管客户端没有下载到原版文件,但是仍然不会影响正常功能的运行。此外,客户端的用户在页面上执行各种操作时,如果该操作调用了上述程序代码文件的功能,那么具体执行了哪些代码内容都会被布点版本文件记录下来。
S104,客户端将代码执行统计结果上传至服务器端;
客户端可以在布点文件的执行过程中实时上传代码执行统计结果,也可以在特定的时机触发上传,例如在用户执行页面某个操作时上传、在用户离开页面时上传等等。上传统计结果时需要附加目标文件标识,以表明代码执行统计结果对应于哪个文件。上传的功能可以设计在引用程序代码文件的页面中,另一种可行的方式是将上传功能设计在布点文件中,本领域技术人员可以根据需求灵活设计。
S105,服务器端接收客户端上传的目标文件的代码执行统计结果;对目标文件的多份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为目标文件的冗余代码。
本申请方案的一个主要思路是,利用庞大的用户数量保证程序运行场景的全面覆盖,因此对于同一个目标文件,服务器端需要综合大量的代码执行统计结果进行分析,这些结果可能源自不同的客户端,也可能源自同一客户端的多次执行。服务器端每接收到一份代码执行统计结果后,按照统计结果附加的目标文件标识,对不同文件的统计结果进行分类存储。
为保证场景覆盖的全面性,对于服务器端而言,可以设定在满足特定条件的情况下开始进行冗余代码分析,例如接收到的代码执行统计结果达到一定数量、或者目标文件上线运行达到一定的时间,等等。具体的分析方法是对多份代码执行统计结果进行交集分析,例如一段代码有A,B,C,D四条语句,当前共有两份该文件的代码执行统计结果,那么,如果统计结果1表明语句A和B被执行、统计结果2表明语句B和C被执行,则D语句将会被标识为冗余代码。这样,通过对大量的代码执行统计结果进行交集分析,就能够找出每次执行程序都没有被执行到的语句,这些语句即是程序代码文件中的冗余代码。
考虑到客户端在执行布点版文件时,性能会有一定程度的降低,因此在本申请的一种具体实施方式中,在能够保证代码执行统计结果数量的前提下,可以设置一些控制策略,选择性地向客户端提供布点版本文件,从而避免用户体验的整体降低。
这里可以采用的一种策略是:以一定的概率将布点版本文件提供给客户端,其中概率值可以根据用户数量,上线时间长短等因素进行设置。假设当前在服务器端预设概率值为1%,则服务器端可以在每100次响应文件下载请求时,提供1次布点版本文件;当然,也可以在每次响应下载请求时,以%1的概率生成随机数,以确定是否用布点版本文件响应该次下载请求。
可以理解的是,服务器端所设置的概率值是可以动态调整的,例如随着用户总数量的增加或减少,可以适当降低或提高概率值;或者根据当前已经收集到的代码执行统计结果数量,动态调整概率值,等等。
除了概率的方式控制之外,还可以根据客户端的某些属性来判断是将布点版本文件提供给客户端,举例如下:
通过获取客户端设备的硬件信息估算客户端设备的性能,如果性能满足要求则将提供布点版本文件,否则提供原版文件,从而避免对低性能设备用户体验产生较大影响;
根据客户端对应的登录用户信息确定是否提供布点版本文件,例如,可以向高级用户提供原版文件,向普通用户提供布点版本文件,以区分不同用户的权项;
判断客户端是否曾经下载过布点版本文件,如果是则不会再次向其提供布点版本文件,以避免多次影响同一用户的使用体验;
当然,可以应用的控制策略还有很多,本申请中无法一一列举,而上述提供的策略实例也不应理解为对本申请方案的限定。
为了更清楚地说明本申请的余额控制方案,下面分别再从单侧的角度,对客户端和服务器端所执行的冗余代码检测方法进行说明:
图3所示为服务器端所执行的冗余代码检测方法流程图,具体可以包括以下步骤:
S201,接收客户端发送的针对目标文件的下载请求;
S202,将目标文件的布点版本文件提供给客户端,以响应下载请求;
服务器段可以设置一些控制策略,选择性地向客户端提供布点版本文件,从而避免用户体验的整体降低。具体的控制策略可以参见前面的实施例,这里不再重复说明。
S203,接收客户端上传的目标文件的代码执行统计结果。
S204,对目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为目标文件的冗余代码。
图4所示为服务器端所执行的冗余代码检测方法流程图,具体可以包括以下步骤:
S301,向服务器端发送针对目标文件的下载请求;
S302,接收服务器端提供的目标文件的布点版本文件;
S303,将执行布点版本文件后得到的代码执行统计结果上传至服务器端。
关于服务器端与客户端的单侧执行方法细节,可以参见前面实施例的描述,这里不再赘述。
相应于上述方法实施例,本申请还提供一种应用于服务器端的冗余代码检测装置,参见图5所示,该装置可以包括:
下载请求接收模块110,用于接收客户端发送的针对目标文件的下载请求;
下载请求响应模块120,用于将目标文件的布点版本文件提供给客户端,以响应下载请求;
统计结果接收模块130,用于接收客户端上传的目标文件的代码执行统计结果,代码执行统计结果通过执行布点版本文件得到;
冗余代码分析模块140,用于对目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为目标文件的冗余代码。
在本申请的一种具体实施方式中,下载请求响应模块120可以具体用于:
以预设的概率,将目标文件的布点版本文件提供给客户端;
或者
根据客户端的属性信息,将目标文件的布点版本文件提供给客户端,其中,客户端的属性信息用于表示该客户端是否接收布点版本文件。
在本申请的一种具体实施方式中,冗余代码分析模块140可以具体用于:
在代码执行统计结果数量达到预设要求的情况下,对目标文件的代码执行统计结果进行交集分析。
本申请还提供一种冗余代码检测系统,该系统可以包括客户端装置及服务器端装置:
客户端装置向服务器端装置发送针对目标文件的下载请求;
服务器端装置接收下载请求,将目标文件的布点版本文件提供给客户端装置,以响应下载请求;
客户端装置将执行布点版本文件后得到的代码执行统计结果上传至服务器端装置;
服务器端装置接收客户端装置上传的目标文件的代码执行统计结果;对目标文件的至少两份代码执行统计结果进行交集分析,根据分析结果,将未被执行过的代码标记为目标文件的冗余代码。
上述装置中各个模块的功能和作用的实现过程具体详见上述方法中对应步骤的实现过程,在此不再赘述。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本申请可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本申请的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本申请各个实施例或者实施例的某些部分所述的方法。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置或系统实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置或系统实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本申请方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本申请的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本申请原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本申请的保护范围。