一种程序中的变量追踪方法和系统与流程

文档序号:33120214发布日期:2023-02-01 03:37阅读:67来源:国知局
一种程序中的变量追踪方法和系统与流程

1.本公开涉及计算机技术领域,特别涉及一种程序中的变量追踪方法和系统。


背景技术:

2.目前主流的集成开发环境(integrated development environment,简称ide)都提供了静态代码分析插件,以实现一些简单的功能。例如,当鼠标指向程序代码中的某一变量时,会高亮显示该变量在程序中所有出现的位置。但是,这类方案只显示了变量出现的位置,而无法分析显示对该变量产生作用的其他相关变量;并且,这类方案只能分析单个函数内的变量,无法对函数间调用进行有效分析。
3.因此,有必要开发一种可分析显示数据流相关变量的系统,以使开发人员在ide进行编码时,可注意到有关联关系的变量,从而对关键变量的影响面有更清楚的认识,提高代码的健壮性。


技术实现要素:

4.本公开的主要目的是提供一种程序中的变量追踪方法和系统,能够分析显示数据流相关变量,从而使开发人员在ide进行编码时对关键变量的影响面有更清楚的认识。
5.本公开一方面提供一种程序中的变量追踪方法,包括:获取位于目标代码中的目标变量,所述目标代码中包括多个变量;基于所述目标代码,确定关联变量集,所述关联变量集包括所述目标代码中与所述目标变量相关的至少一个关联变量;以及输出所述关联变量集。
6.在一些实施例中,所述目标变量包括入参、成员变量、静态变量和返回值中的至少一种;以及所述关联变量包括入参、局部变量、成员变量和静态变量中的至少一种。
7.在一些实施例中,所述程序中的变量追踪方法还包括:输出所述目标变量。
8.在一些实施例中,所述输出的方式包括可视化展示;以及,所述可视化展示包括语言列表显示和高亮显示中的至少一种。
9.在一些实施例中,所述确定关联变量集,包括:将所述目标代码中的每一条执行语句作为目标分析语句:确定所述目标分析语句中的变量传递关系;基于所述变量传递关系,从所述多个变量中确定影响所述目标变量的所述关联变量;以及将每一条执行语句中的所述关联变量合并,得到所述关联变量集
10.在一些实施例中,在所述确定所述目标分析语句中的变量传递关系之前,还包括:将所述目标代码中包含的所有执行语句排列成目标分析队列;以及依次从所述目标分析队列的队头获取一条执行语句作为目标分析语句。
11.在一些实施例中,所述确定所述目标分析语句中的变量传递关系,包括:确定所述目标分析语句的语句类型,所述语句类型包括返回语句、赋值语句和函数调用语句中的至少一种;以及基于所述语句类型,确定与所述目标分析语句对应的所述变量传递关系。
12.在一些实施例中,所述确定与所述目标分析语句对应的变量传递关系,包括:所述
语句类型为函数调用语句时,获取所述目标分析语句中被调用函数的目标分析结果,所述目标分析结果中包括所述被调用函数中与所述目标变量相关的关联变量;以及基于所述目标分析结果确定所述目标分析语句的所述变量传递关系。
13.在一些实施例中,所述所述语句类型为函数调用语句时,获取所述目标分析语句中被调用函数的目标分析结果,包括:确定所述被调用函数为sink函数,将所述sink函数中所有的污点变量作为所述目标分析结果中与所述目标变量相关的所述关联变量。
14.在一些实施例中,所述目标分析语句包括输入状态和输出状态;以及所述从所述多个变量中确定影响所述目标变量的所述关联变量,包括:确定在所述输入状态下所述目标分析语句中与所述目标变量相关的第一关联变量,基于所述变量传递关系和所述第一关联变量,确定在所述输出状态下所述目标分析语句中与所述目标变量相关的第二关联变量,以及将所述第二关联变量作为所述目标分析语句中与所述目标变量相关的关联变量。
15.在一些实施例中,所述确定在所述输入状态下所述目标分析语句中与所述目标变量相关的第一变量,包括:获取所述目标代码中与所述目标分析语句相邻的执行语句;以及将所述相邻的执行语句中的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量。
16.在一些实施例中,所述相邻的执行语句包括相邻的上一层执行语句和相邻的下一层执行语句中的至少一种;以及所述将所述相邻的执行语句中的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量,包括:对所述目标变量进行属性分析,确定所述目标变量的变量类型,所述目标变量为入参时,确定将所述相邻的上一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量,以及所述目标变量为返回值、静态变量、成员变量中的至少一种时,确定将所述相邻的下一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的所述第一关联变量。
17.在一些实施例中,所述从所述多个变量中确定影响所述目标变量的所述关联变量,还包括:确定在所述输入状态下所述目标分析语句中所述第一关联变量之间的第一传递关系;以及基于所述变量传递关系和所述第一传递关系,确定在所述输出状态下所述目标分析语句中所述第二关联变量之间的第二传递关系。
18.在一些实施例中,在所述从所述多个变量中确定影响所述目标变量的所述关联变量之后,还包括:确定所述目标分析语句存在历史第二关联变量;将所述目标分析语句在本轮得到的当前第二关联变量与所述历史第二关联变量进行比对;以及确定所述当前第二关联变量与所述历史第二关联变量不同,将所述当前第二关联变量作为所述目标分析语句在本轮的关联变量。
19.在一些实施例中,在所述确定所述当前第二关联变量与所述历史第二关联变量不同之后,还包括:获取目标代码中与所述目标分析语句相邻的执行语句作为关联执行语句;以及将所述目标分析语句与所述关联执行语句加入所述目标分析队列的队尾。
20.在一些实施例中,所述程序中的变量追踪方法还包括:将所述关联变量集存储为所述目标变量在所述目标代码中的目标分析结果。
21.在一些实施例中,在所述获取位于目标代码中的目标变量之后,还包括:识别所述目标代码中包含的代码块,每一个代码块对应一个函数;创建所述代码块之间的调用关系网络,所述调用关系网络反映代码块之间的调用关系;将位于所述调用关系网络中的所有
代码块排列成代码块分析队列,所述代码块分析队列包括第一队列和第二队列,所述代码块分析队列中的每一个元素对应一个代码块;以及依次从所述代码块分析队列的队头取出一个代码块,确定所述代码块中与所述目标变量相关的关联变量集。
22.在一些实施例中,所述代码块分析队列的配置方法,包括:将所述调用关系网络中的所有代码块作为第一代码块,将所述第一代码块排列成第一队列;和/或提取所述调用关系网络中与sink函数相关的代码块作为第二代码块,将所述第二代码块排列成第二队列。
23.在一些实施例中,所述确定所述代码块中与所述目标变量相关的关联变量集包括:将所述代码块分析队列的队头的代码块作为目标代码进行变量追踪,得到所述代码块中与所述目标变量相关的关联变量集;以及将所述关联变量集作为所述代码块在本轮的当前目标分析结果。
24.在一些实施例中,在所述确定所述代码块中与所述目标变量相关的关联变量集之后,还包括:更新所述目标代码的目标分析结果,包括:确定所述代码块存在历史目标分析结果;将所述代码块的所述当前目标分析结果与所述历史目标分析结果进行比对;以及确定所述代码块的当前目标分析结果与所述历史目标分析结果不同,将所述代码块的当前目标分析结果作为所述代码块在本轮的目标分析结果。
25.在一些实施例中,在所述更新所述目标代码的目标分析结果之后,还包括:从所述调用关系网络中查找与所述代码块具有调用关系的相关代码块;
26.将所述代码块和所述相关代码块添加至所述代码块分析队列的队尾。
27.本公开另一方面提供一种程序中的变量追踪系统,包括:至少一个存储介质,包括至少一个指令集,用于程序中的变量追踪方法的实施分析;以及至少一个处理器,同所述至少一个存储介质通讯连接,其中,当所述系统运行时,所述至少一个处理器读取所述至少一个指令集,并且根据所述至少一个指令集的指示执行上述程序中的变量追踪方法。
28.由以上技术方案可知,本公开提供的程序中的变量追踪方法、执行此方法的系统。所述方法和系统通过对目标代码中的目标变量进行分析,以追踪目标代码中与目标变量相关的关联变量,便于开发人员在ide进行编码时,注意到与目标变量有关联关系的变量,对关键变量的影响面有更清楚的认识,提高代码的健壮性。
29.本公开提供的程序中的变量追踪方法和系统的其他功能将在以下说明书中部分列出。根据描述,以下数字和实例介绍的内容将对那些本领域的普通技术人员显而易见。本公开提供的程序中的变量追踪方法和系统的创造性方面可以通过实践或使用下面详细实例中所述的方法、装置和组合得到充分解释。
附图说明
30.为了更清楚地说明本公开实施例中的技术方案,下面将对实施例描述中所需要的使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本公开的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
31.图1示出了根据本公开中实施例方案涉及的硬件运行环境的终端结构示意图;
32.图2示出了根据本公开中的一些实施例中的一种程序中的变量追踪方法的服务器示意图;
33.图3示出了根据本公开的一些实施例提供的一种程序中的变量追踪方法的方法流程图;
34.图4示出了根据本公开的一些实施例提供的一种程序中的变量追踪方法一实施例的方法流程图;
35.图5示出了根据本公开的一些实施例提供的一种函数代码示意图;
36.图6示出了根据本公开的一些实施例提供的一种可视化展示界面示意图;
37.图7示出了根据本公开的一些实施例提供的一种可视化展示界面示意图;
38.图8示出了根据本公开的一些实施例提供的一种程序中的变量追踪方法一实施例的方法流程图;
39.图9示出了根据本公开的一些实施例提供的一种函数代码示意图;
40.图10示出了根据本公开的一些实施例提供的一种函数的控制流图;
41.图11示出了根据本公开的一些实施例提供的一种可视化展示界面示意图;
42.图12示出了根据本公开的一些实施例提供的一种可视化展示界面示意图;
43.图13示出了根据本公开的一些实施例提供的代码示意图;
44.图14示出了根据本公开的一些实施例提供的一种可视化展示界面示意图;
45.图15示出了根据本公开的一些实施例提供的代码示意图;
46.图16示出了根据本公开的一些实施例提供的入参分析操作流程示意图;
47.图17示出了根据本公开的一些实施例提供的入参分析流程所涉及模块a的操作流程示意图;
48.图18示出了根据本公开的一些实施例提供的入参分析流程所涉及模块b的操作流程示意图;
49.图19示出了根据本公开的一些实施例提供的入参分析流程所涉及模块c的操作流程示意图;
50.图20示出了根据本公开的一些实施例提供的成员变量/静态变量分析操作流程示意图;
51.图21示出了根据本公开的一些实施例提供的成员变量/静态变量分析流程所涉及模块d的操作流程示意图;
52.图22示出了根据本公开的一些实施例提供的成员变量/静态变量分析流程所涉及模块e的操作流程示意图;
53.图23示出了根据本公开的一些实施例提供的成员变量/静态变量分析流程所涉及模块f的操作流程示意图;
54.图24示出了根据本公开的一些实施例提供的sink分析操作流程示意图;
55.图25示出了根据本公开的一些实施例提供的返回值分析操作流程示意图;以及
56.图26示出了根据本公开的一些实施例提供的函数间分析操作流程示意图。
具体实施方式
57.以下描述提供了本公开的特定应用场景和要求,目的是使本领域技术人员能够制造和使用本公开中的内容。对于本领域技术人员来说,对所公开的实施例的各种局部修改是显而易见的,并且在不脱离本公开的精神和范围的情况下,可以将这里定义的一般原理
应用于其他实施例和应用。因此,本公开不限于所示的实施例,而是与权利要求一致的最宽范围。
58.这里使用的术语仅用于描述特定示例实施例的目的,而不是限制性的。比如,除非上下文另有明确说明,这里所使用的,单数形式“一”,“一个”和“该”也可以包括复数形式。当在本公开中使用时,术语“包括”、“包含”和/或“含有”意思是指所关联的整数,步骤、操作、元素和/或组件存在,但不排除一个或多个其他特征、整数、步骤、操作、元素、组件和/或组的存在或在该系统/方法中可以添加其他特征、整数、步骤、操作、元素、组件和/或组。
59.考虑到以下描述,本公开的这些特征和其他特征、以及结构的相关元件的操作和功能、以及部件的组合和制造的经济性可以得到明显提高。参考附图,所有这些形成本公开的一部分。然而,应该清楚地理解,附图仅用于说明和描述的目的,并不旨在限制本公开的范围。还应理解,附图未按比例绘制。
60.本公开中使用的流程图示出了根据本公开中的一些实施例的系统实现的操作。应该清楚地理解,流程图的操作可以不按顺序实现。相反,操作可以以反转顺序或同时实现。此外,可以向流程图添加一个或多个其他操作。可以从流程图中移除一个或多个操作。
61.为了方便描述,本说明书将对以下描述将会出现的术语进行如下解释。
62.入参:入参的值是被调用函数需要的。
63.成员变量:属于对象,又称为对象变量。成员变量随着对象的创建而存在,随着对象的消失而消失。
64.静态变量:由static修饰的变量称为静态变量,静态变量属于类,又称为类变量。静态变量随着类的加载而加载,随着类的消失而消失。
65.局部变量:局部变量只定义在局部范围内,如:函数内,语句内等,只在所属的区域有效。
66.返回值:子程序或者函数执行结束后返回给主程序或者调用函数的函数的值。需要注意的是,一个函数的函数名即是该函数的代表,也是一个变量。由于函数名变量通常用来把函数的处理结果数据返回给调用函数,即递归调用,所以一般把函数名变量成为返回值。
67.污点分析:可以抽象成一个三元组《sources,sinks,sanitizers》的形式,其中,source即污点源,代表直接引入不受信任的数据或者机密数据到系统中;sink即污点汇聚点,代表直接产生安全敏感操作(违反数据完整性)或者泄露隐私数据到外界(违反数据保密性);sanitizer即无害处理,代表通过数据加密或者移除危害操作等手段使数据传播不再对软件系统的信息安全产生危害。污点分析就是分析程序中由污点源引入的数据是否能够不经无害处理,而直接传播到污点汇聚点。如果不能,说明系统是信息流安全的;否则,说明系统产生了隐私数据泄露或危险数据操作等安全问题。
68.sink函数:代表直接产生安全敏感操作或者泄露隐私数据到外界的函数,sink函数可经人为指定,或经服务器指定,当预先指定某一或某些函数为sink函数后,系统可以识别被指定的sink函数。
69.控制流图(control flow graph,cfg):也叫控制流程图,是一个过程或程序的抽象表现,是用在编译器中的一个抽象数据结构,由编译器在内部维护,代表了一个程序执行过程中会遍历到的所有路径。它用图的形式表示一个过程内所有基本块执行的可能流向,
也能反映一个过程的实时执行过程。
70.队列(queue):一种操作受限的线性表,只允许在表的一端进行插入,而在表的另一端进行删除。向队列中插入元素称为入队或进队;删除元素称为出队或离队。其操作特性为先进先出(first in first out,fifo),并且只允许在队尾进,队头出。
71.赋值语句:由赋值运算符将一个变量和一个表达式连接起来的式子,也成“赋值表达式”。赋值语句可以将一个表达式的值赋给一个变量。赋值语句中包括:左操作数(左值):放在赋值运算符的左边;右操作数(右值):放在赋值运算符的右边。
72.图1示出了根据本公开中一些实施例中的一种程序中的变量追踪的系统100的示意图。系统100可以包括客户端110、集成开发平台120、集成开发平台服务器130以及数据库140。
73.集成开发平台120,也称集成开发环境(ide,integrated development environment),集成开发平台120是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。开发人员可以通过客户端110在集成开发平台120上进行程序代码的编写(即程序开发)。集成开发平台服务器130(以下简称服务器130)可以是集成开发平台120上专门用来处理程序中的变量追踪的计算设备。在本技术中,集成开发平台120上可以有多个开发人员110a、110b、110c(统称客户端110)进行程序开发。
74.服务器130可以存储有执行本公开描述的程序中的变量追踪方法的数据或指令,并可以执行或用于执行所述数据和/或指令。服务器130可以包括具有数据信息处理能力的硬件设备和驱动该硬件设备工作所需必要的程序。当然,服务器130也可以仅为具有数据处理能力的硬件设备,或者,仅为运行在硬件设备中的程序。在一些实施例中,服务器130也可以作为插件,并部署在客户端110。
75.数据库140可以存储数据和/或指令。在一些实施例中,数据库140可以存储服务器130执行或用于执行本公开中描述的程序中的变量追踪方法的数据和/或指令。客户端110和服务器130可能具有访问数据库140的权限,客户端110和服务器130可以通过网络访问存储在数据库140中的数据或指令.在一些实施例中,数据库140可以直接连接到客户端110和服务器130。在一些实施例中,数据库110可以是服务器130的一部分。在一些实施例中,数据库140可以包括大容量存储、可移动存储、易失性读写存储器、只读存储器(rom)或类似内容,或其任意组合。示例性大容量存储可能包括磁盘、光盘、固态驱动器等非暂时性存储介质(non-transitory storage medium)。示例可移动存储可能包括闪存驱动器、软盘、光盘、存储卡、zip磁盘、磁带等。典型的易失性读写内存可能包括随机存取存储器(ram)。示例ram可能包括动态ram(dram)、双日期速率同步动态ram(ddrsdram)、静态ram(sram)、晶闸管ram(t-ram)和零电容ram(z-ram)等。示例性rom可包括掩码rom(mrom)、可编程rom(prom)、可虚拟可编程rom(perom)、电子可编程rom(eeprom)、光盘(cd-rom)和数字多功能磁盘rom等。
76.应该理解,图1中的客户端110、服务器130的数目仅仅是示意性的。根据实现需要,可以具有任意数目的客户端110和服务器130。
77.需要说明的是,所述程序中的变量追踪方法可以完全在客户端110上执行,也可以完全在服务器130上执行,还可以部分在客户端110上执行,部分在服务器130上执行。
78.为了方便描述,本公开后面的说明均将以在服务器130上执行所述程序中的变量追踪方法为例对本公开涉及的技术方案进行描述。
79.图2是根据本公开的一些实施例提供的一种计算设备200的结构示意图。所述计算设备200可以是通用计算机或专用计算机。比如,所述计算设备200可以是服务器、个人电脑、便携式电脑(比如笔记本计算机、平板电脑等),也可以是有其他计算能力的电子设备。当然,所述计算设备可以是图1中服务器130,也可以是多个开发人员110a、110b、110c(客户端110)用来在集成开发平台上进行程序开发的终端设备。
80.如图2所示,所述计算设备200可以包括com端口250,该com端口250可以连接到网络或从其连接的网络中出来,以促进数据通信。计算设备200还可包括以一个或多个处理器的形式的处理器220,比如中央处理单元(cpu),用于执行程序指令。所述计算设备200还可以包括内部通信总线210和不同形式的程序存储介质和数据存储介质,例如磁盘270(非暂时性存储器)以及只读存储器(rom)230或随机存取存储器(ram)240等等,用于存储要处理和/或传输的各种数据文件。所述存储介质可以是所述计算设备200本地的存储介质,也可以是所述计算设备200共享的存储介质(比如图1所示的存储介质m)。所述计算设备200还可以包括存储在rom 230,ram 240和/或要由处理器220执行的其他类型的非暂时性存储介质中的程序指令。所述计算设备200还可以包括i/o组件260来支持同所述分布式计算系统100中其他计算设备之间的数据通信。所述计算设备200还可以经由网络通信来接收编程和数据。
81.仅出于说明的目的,在所述计算设备200中仅描述了一个处理器220。然而,本领域普通技术人员可以理解的是,本技术中的计算设备200还可以包括多个处理器。因此本技术中所述的由一个处理器执行的方法/步骤/操作也可以由多个处理器共同或分别执行。例如,如果在本技术中,所述计算设备200的处理器可以同时执行步骤a和步骤b。应当理解的是,步骤a和步骤b也可以由两个不同的处理器共同执行。例如,第一处理器执行步骤a,第二处理器执行步骤b,或者第一处理器和第二处理器共同执行步骤a和b。
82.图3示出了根据本公开的一些实施例提供的一种程序中的变量追踪方法的方法流程图300;
83.下面将结合图3描述本公开的技术方案。实施所述技术方案的主体可以是图1中的客户端110、集成开发平台120、服务器130中的至少一种。具体地,所述客户端110、集成开发平台120和/或服务器130可以具有如图2所述的结构,即,所述客户端110、集成开发平台120和/或服务器130可以是一种用于程序中的变量追踪的设备,包括:至少一个存储介质,和至少一个处理器。所述至少一个存储介质中包括至少一个指令集,用于程序中的变量追踪。所述至少一个处理器,同所述至少一个存储介质通信连接。当所述系统运行时,所述至少一个处理器可以读取所述至少一个指令集,并且根据所述至少一个指令集的指示执行图3所述的方法300。仅仅为了说明的需要,本技术将以服务器130执行所述方法300为例进行描述。所述方法可以包括:
84.s310,获取位于目标代码中的目标变量,所述目标代码中包括多个变量。
85.目标代码可以是开发人员在客户端110进行程序开发时输入的程序代码,也可以是客户端110中已经存在的并可以供开发人员进行操作的程序代码。开发人员可根据需要选择或指定需要进行变量追踪的程序代码作为所述目标代码,此时,服务器130可获取到开发人员已选择或指定的需要进行变量追踪的程序代码作为目标代码。因此,本公开中的所述目标代码可以是一个单独的程序语句,也可以是一段具有特定功能的、可重复使用的语
句组(即函数),还可以是由多个函数组成的代码(即代码中存在函数调用)。
86.服务器130的至少一个处理器可以获取目标代码中的目标变量。比如,该目标变量可以是程序预先根据一定规则选定的,也可以是通过开发人员在目标代码的显示界面上通过鼠标点击所指定的。
87.在程序代码(也即目标代码)中,可能存在多个不同类型的变量,例如:入参、成员变量、局部变量、静态变量、返回值等。其中,局部变量表示那些只能在定义的相应函数体的内部进行使用的变量,当函数执行结束之后,定义在函数体内部的局部变量的内存空间就会被释放。本公开的所述目标变量包括入参、成员变量、静态变量和返回值中的至少一种。即本公开的变量追踪方法可以对入参、成员变量、静态变量或返回值进行变量追踪,以查找目标代码中与入参、成员变量、静态变量和返回值中的至少一种相关的关联变量。当然,所述目标变量也可以包括局部变量。
88.s320,基于所述目标代码,确定关联变量集,所述关联变量集包括所述目标代码中与所述目标变量相关的至少一个关联变量。
89.服务器130获取到目标代码后,可以自动识别目标代码中包含的目标变量,当服务器130识别到目标代码中包含入参、成员变量、静态变量和返回值中的至少一种时,则分别对入参、成员变量、静态变量或返回值进行变量追踪,确定目标代码中与入参相关的关联变量,确定目标代码中与成员变量相关的关联变量,确定目标代码中与静态变量相关的关联变量,以及确定目标代码中与返回值相关的关联变量。
90.服务器130获取到目标代码后,还可以根据客户端110中由开发人员指定的目标变量进行变量追踪。例如,开发人员可以通过客户端110指定目标代码中的某一个变量作为目标变量,服务器130获取到该目标变量后,则对该目标变量进行变量追踪,确定目标代码中与该目标变量相关的关联变量。
91.若程序代码中两个以上的变量之间具有直接的或间接的传递关系(传递包括主动传递和被动传递),则在这条传播链上的变量均可视为关联变量。其中,以执行语句“a=b+1”为例,该语句为赋值语句,该语句中包含两个变量:变量a和变量b。该语句中变量之间存在的传递关系为:a《-b,即变量b将污点主动传递给变量a,而变量a则被动接受变量b传递的污点。此时,可以说变量b对变量a为主动传递,也可以说变量a对变量b为被动传递。应当理解,上述举例对本公开的变量之间的传递关系的适用范围不具有限定作用。
92.本公开中,关联变量即是目标变量所在的传播链上所包含的除该目标变量外的其他变量,关联变量可以包括入参、局部变量、成员变量和静态变量中的至少一种。
93.通常情况下,目标代码中与目标变量相关的关联变量的个数不局限于一个。为了便于描述,采用关联变量集代表目标代码中与目标变量相关的关联变量,即关联变量集为目标代码中与目标变量相关的关联变量的集合。一般情况下,关联变量集中包括至少一个与目标变量相关的关联变量。应当理解,若目标代码中不存在与目标变量相关的关联变量,则可以理解为所述关联变量集为空集,也可以理解为不存在关联变量集。
94.本公开提供的技术方案中,服务器130在对目标代码进行变量追踪时,需对目标代码的执行语句(statements)进行遍历,确定每一条执行语句中与目标变量相关的关联变量,将每一条执行语句中对应的关联变量合并后即得到目标代码中与目标变量相关的关联变量集。具体地,如图4所示,步骤s320可以包括:
95.s321,将所述目标代码中包含的所有执行语句排列成目标分析队列。
96.s322,依次从所述目标分析队列的队头获取一条执行语句作为目标分析语句。
97.目标代码执行过程中可以通过控制流图的形式进行反映。
98.目标分析队列中储存了待分析的目标代码所包含的执行语句,目标分析队列中的每一个元素对应一条执行语句。应当理解,目标分析队列中的执行语句的顺序可以按照目标代码对应的控制流图中执行语句的顺序进行排列,也可以不按照目标代码对应的控制流图中执行语句的顺序进行排列。
99.本公开以队列的形式对目标代码中的执行语句进行遍历,将所述目标代码中的每一条执行语句作为目标分析语句,再对每一条目标分析语句进行变量追踪。
100.具体地,服务器130针对每一条目标分析语句,可以按照如下步骤进行变量追踪:
101.s323,确定所述目标分析语句中的变量传递关系。
102.本公开中,每一条目标分析语句对应一个输入状态(in)和一个输出状态(out)。目标分析语句在执行前(未执行时)对应的状态即输入状态,目标分析语句在执行完毕后对应的状态即输出状态。目标分析语句中的变量传递关系可以是反映该目标分析语句在执行过程中,该目标分析语句所涵盖的变量之间所产生的影响关系(或传递关系),也可以是该目标分析语句所涵盖(或指向)的变量。变量传递关系的确定可以基于目标分析语句的语句类型进行分类分析。目标分析语句的语句类型包括返回语句、赋值语句和函数调用语句中的至少一种。
103.当目标分析语句为返回语句时,目标分析语句中的变量传递关系为该目标分析语句所指向的变量,即该目标分析语句所返回的变量。
104.当目标分析语句为赋值语句或函数调用语句时,目标分析语句中的变量传递关系即该目标分析语句所涵盖的变量之间所产生的传递关系。
105.对于函数调用语句,如果被调用函数已经具有对应的目标分析结果,则可直接获取被调用函数的目标分析结果;再根据被调用函数的目标分析结果确定所述目标分析语句的所述变量传递关系。其中,所述目标分析结果中包括所述被调用函数中与所述目标变量相关的关联变量。如果被调用函数没有对应的目标分析结果,则需先对被调用函数进行变量追踪,确定被调用函数中与目标变量相关的关联变量,并将被调用函数中与目标变量相关的关联变量作为被调用函数的目标分析结果;再根据被调用函数的目标分析结果确定所述目标分析语句的变量传递关系。
106.系统100对函数的目标分析结果进行存储,以便将来该函数被调用时直接根据该函数的目标分析结果确定调用该函数的目标分析语句的变量传递关系,从而极大提高变量追踪的效率。
107.在一些实施例中,若被调用函数为sink函数,此时,将sink函数的所有入参作为污点变量,并将所有污点变量作为所述目标分析结果中与所述目标变量相关的所述关联变量。
108.例如,如图5所示的代码中包含三个函数,其函数名分别为:sink、sinktest0和sinktest1。图5中,左侧数字表示每行代码所对应的行数。如前所述,由于sink函数为预先指定的某一或某些函数,因而,图5中函数名为“sink”、“sinktest0”和“sinktest1”的三个函数均可以被指定为sink函数。应当理解,函数名与sink函数没有必然联系。
109.本公开中,若指定函数名为“sink”的函数为sink函数,则对于该函数而言,其所包含的所有入参(入参x、入参y和入参z)将作为污点变量,并作为该函数的目标分析结果中与目标变量相关的关联变量。而未指定的另外两个函数(函数名分别为sinktest0和sinktest1)则不是sink函数。
110.需要注意的是,对于sink函数而言,其所包含的污点变量对于所有类型的目标变量而言均为关联变量。即无论目标变量是入参、返回值、成员变量或静态变量中的任何一种,sink函数中的污点变量将全部作为调用sink函数的执行语句中与目标变量相关的关联变量。
111.对于赋值语句,分为两种情况:(a)赋值语句中未嵌套函数调用语句;(b)赋值语句中嵌套函数调用语句。对于(a)赋值语句中未嵌套函数调用语句的情况,根据赋值语句的左操作数和右操作数的传递关系确定该赋值语句的变量传递关系。对于(b)赋值语句中嵌套函数调用语句的情况,先按照与函数调用语句相同的方法确定被调用函数的目标分析结果,并将被调用函数的目标分析结果合并到赋值语句的右操作数中,再根据赋值语句的左操作数和右操作数的传递关系确定该赋值语句的变量传递关系。
112.s324,基于所述变量传递关系,从所述多个变量中确定影响所述目标变量的所述关联变量。
113.为了便于理解区分,将目标分析语句在输入状态下与目标变量相关的关联变量称为第一关联变量;将目标分析语句在输出状态下与目标变量相关的关联变量称为第二关联变量,第二关联变量将作为该目标分析语句中与目标变量相关的关联变量。应当理解,在一般情况下,目标分析语句的第一关联变量和第二关联变量不相同。并且,第一关联变量和第二关联变量可以是单数,也可以是复数。
114.每一条目标分析语句的第一关联变量和第二关联变量通过该目标分析语句的变量传递关系连接,即在已知目标分析语句的第一关联变量、第二关联变量和变量传递关系中的任意两者的条件下,可以确定第三者的具体情况。例如,在已知目标分析语句的第一关联变量和变量传递关系的条件下,可以确定该目标分析语句的第二关联变量。在已知目标分析语句的第二关联变量和变量传递关系的条件下,可以确定该目标分析语句的第一关联变量。在已知目标分析语句的第一关联变量和第二关联变量的条件下,可以确定该目标分析语句的变量传递关系。
115.具体的,如图8所示,步骤s324可以包括:
116.s324-a,确定在所述输入状态下所述目标分析语句中与所述目标变量相关的第一关联变量。具体地,目标分析语句的第一关联变量的确定可以结合该目标分析语句在目标代码中所处的位置进行分析,即可以结合目标代码中与所述目标分析语句相邻的执行语句进行分析。在一些实施例中,可以将目标代码转化为控制流图,控制流图清楚地展示了目标代码在程序执行过程中会遍历到的所有路径。根据控制流图,可以确定与目标分析语句相邻的执行语句。相邻的执行语句包括相邻的上一层执行语句和相邻的下一层执行语句中的至少一种。
117.以图9所示的函数为例,图9所示的函数名为“functionforexample”,其对应的控制流图如图10所示,图10的控制流图中显示了该函数所包含的执行语句的执行顺序。若目标分析语句为“x=y+1”,则与执行语句“x=y+1”相邻的上一层执行语句为“z=x+1”,与执
行语句“x=y+1”相邻的下一层执行语句为执行语句“z=z+10”和执行语句“z=z-10”。若目标分析语句为“z=x+1”,则不存在与执行语句“z=x+1”相邻的上一层执行语句,与执行语句“z=x+1”相邻的下一层执行语句为“x=y+1”。同理,若目标分析语句为“return z”,则与执行语句“return z”相邻的上一层执行语句为执行语句“z=z+10”和执行语句“z=z-10”,而不存在与执行语句“return z”相邻的下一层执行语句。
118.在一些实施例中,可以获取所述目标代码中与所述目标分析语句相邻的执行语句,将所述相邻的执行语句中的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量。其中,可根据目标变量的变量类型,选择将与所述目标分析语句相邻的上一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量;也可以选择将与所述目标分析语句相邻的下一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量。
119.具体的,对所述目标变量进行属性分析,确定所述目标变量的变量类型。如前所述,目标变量包括入参、成员变量、静态变量和返回值中的至少一种。
120.当目标变量为入参时,确定将所述相邻的上一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的第一关联变量。以图9所示的函数为例,当目标变量为入参,且以执行语句“x=y+1”作为目标分析语句时,确定将执行语句“z=x+1”的第二关联变量作为该目标分析语句的第一关联变量。当目标变量为入参,且以执行语句“return z”作为目标分析语句时,由于与执行语句“return z”相邻的上一层执行语句包括执行语句“z=z+10”和执行语句“z=z-10”,此时,将执行语句“z=z+10”的第二关联变量和执行语句“z=z-10”的第二关联变量合并后作为该目标分析语句的第一关联变量。同理,执行语句“x=y+1”的第二关联变量既可以作为执行语句“z=z+10”的第一关联变量,也可以作为执行语句“z=z-10”的第一关联变量。
121.在一些实施例中,当目标分析语句没有相邻的执行语句时,可以将该目标分析语句的第一关联变量初始化为零。例如,图9所示的函数的入参包括变量x和变量y,当指定目标变量为变量x,且以执行语句“z=x+1”作为目标分析语句时,由于目标分析语句“z=x+1”没有相邻的上一层执行语句,此时,可以将该目标分析语句的第一关联变量初始化为零。
122.应当理解,并非必须要在明确了目标分析语句的第一关联变量、第二关联变量和变量传递关系中的任意两者之后,才能确定第三者的具体情况。
123.当目标变量为返回值、静态变量、成员变量中的至少一种时,确定将所述相邻的下一层执行语句的第二关联变量作为所述目标分析语句中与所述目标变量相关的所述第一关联变量。同样以图9所示的函数为例,当目标变量为返回值z,且以执行语句“x=y+1”作为目标分析语句时,由于与执行语句“x=y+1”相邻的下一层执行语句包括执行语句“z=z+10”和执行语句“z=z-10”,此时,将执行语句“z=z+10”的第二关联变量和执行语句“z=z-10”的第二关联变量合并后作为该目标分析语句的第一关联变量。当目标变量为返回值z,且以执行语句“return z”作为目标分析语句时,由于不存在与执行语句“return z”相邻的下一层执行语句,此时,可将该目标分析语句的第一关联变量初始化为零。同理,执行语句“return z”的第二关联变量既可以作为执行语句“z=z+10”的第一关联变量,也可以作为执行语句“z=z-10”的第一关联变量。
124.目标变量为静态变量和/或成员变量时,按照目标变量为返回值的处理方法确定
目标分析语句中与目标变量相关的第一关联变量。在此不一一赘述。
125.上述根据目标变量的变量类型确定目标分析语句的第一关联变量的方法中,当目标变量为入参时,是沿着控制流图的顺序方向传递第一相关变量;而当目标变量为返回值、静态变量、成员变量中的至少一种时,则沿着控制流图的逆序方向传递第一相关变量。
126.s324-b,基于所述变量传递关系和所述第一关联变量,确定在所述输出状态下所述目标分析语句中与所述目标变量相关的第二关联变量。
127.以图9所示的函数为例,当指定目标变量为返回值z,且以执行语句“return z”作为目标分析语句时,由于目标分析语句“return z”没有相邻的下一层执行语句,此时,将目标分析语句“return z”的第一关联变量初始化为零,即目标分析语句“return z”没有对应的第一关联变量。由于目标分析语句“return z”为返回值语句,如前所述,目标分析语句“return z”的变量传递关系为为该目标分析语句所指向的变量z。因此,根据目标分析语句“return z”的第一关联变量和变量传递关系可以确定目标分析语句“return z”的第二关联变量为:变量z。
128.在目标变量不变的情况下,当以执行语句“z=z+10”作为目标分析语句时,由于与目标分析语句“z=z+10”相邻的下一层执行语句为执行语句“return”,因而将执行语句“return z”的第二关联变量作为目标分析语句“z=z+10”的第一关联变量。目标分析语句“z=z+10”为赋值语句,其对应的变量传递关系为:z《-z,即变量z对变量z传递了污点。因此,根据目标分析语句“z=z+10”的第一关联变量和变量传递关系可以确定目标分析语句“z=z+10”的第二关联变量为:变量z。
129.在目标变量不变的情况下,当以执行语句“z=z-10”作为目标分析语句时,同理,将执行语句“return z”的第二关联变量作为目标分析语句“z=z-10”的第一关联变量。目标分析语句“z=z+10”为赋值语句,其对应的变量传递关系为:z《-z。根据目标分析语句“z=z-10”的第一关联变量和变量传递关系可以确定目标分析语句“z=z-10”的第二关联变量为:变量z。
130.在目标变量不变的情况下,当以执行语句“x=y+1”作为目标分析语句时,由于与目标分析语句“x=y+1”相邻的下一层执行语句包括执行语句“z=z+10”和执行语句“z=z-10”。此时,需将执行语句“z=z+10”的第二关联变量和执行语句“z=z-10”的第二关联变量合并后作为该目标分析语句的第一关联变量。根据前述分析可知,执行语句“z=z+10”的第二关联变量为:变量z;执行语句“z=z-10”的第二关联变量为:变量z。因而,将执行语句“z=z+10”的第二关联变量和执行语句“z=z-10”的第二关联变量合并后得到的目标分析语句“x=y+1”的第一关联变量为:变量z。目标分析语句“x=y+1”为赋值语句,其对应的变量传递关系为:x《-y。由于目标执行语句“x=y+1”的第一关联变量和变量传递关系中所涉及的变量之间没有传递关系,因而,可以确定目标分析语句“x=y+1”的第二关联变量为空,即目标分析语句“x=y+1”中不存在与目标变量具有传递关系的关联变量。
131.在目标变量不变的情况下,当以执行语句“z=x+1”作为目标分析语句时,由于与目标分析语句“z=x+1”相邻的下一层执行语句为执行语句“x=y+1”,而执行语句“x=y+1”的第二关联变量为空,目标分析语句“z=x+1”的第一关联变量也为空。目标分析语句“z=x+1”为赋值语句,其对应的变量传递关系为:z《-x。根据目标分析语句“z=x+1”的第一关联变量和变量传递关系可以确定目标分析语句“z=x+1”的第二关联变量为:变量x。
132.上述在确认了目标分析语句所对应的第二关联变量之后,s324-c,将所述第二关联变量作为所述目标分析语句中与所述目标变量相关的关联变量。因而,对于执行语句“return z”而言,其中与目标变量z(返回值z)相关的关联变量为:变量z。对于执行语句“z=z+10”而言,其中与目标变量z(返回值z)相关的关联变量为:变量z。对于执行语句“z=z-10”而言,其中与目标变量z(返回值z)相关的关联变量为:变量z。对于执行语句“x=y+1”而言,其不存在与目标变量z(返回值z)相关的关联变量。对于执行语句“z=x+1”而言,其中与目标变量z(返回值z)相关的关联变量为:变量x。
133.应当理解,第一关联变量和/或第二关联变量所对应的变量个数不仅限于一个,第一关联变量和/或第二关联变量所对应的变量个数为自然数。
134.s325,将每一条执行语句中的所述关联变量合并,得到所述关联变量集。
135.目标代码的所有执行语句所包含的与目标变量相关的关联变量的集合,可称为目标代码的关联变量集。对于图9所示的函数,在上述分析的基础上,将每一条执行语句中的关联变量合并后,即可得到与目标变量(返回值z)相关的关联变量集。该关联变量集中包括:变量z和变量x。
136.在一些实施例中,所述关联变量集还可以是每一条执行语句中所包含的与目标变量相关的关联变量的集合,可称为目标分析语句的关联变量集。应当理解,目标代码的关联变量集和目标分析语句的关联变量集可以同时存在,二者并不冲突。服务器130在执行程序中的变量追踪方法时,可以将每一条执行语句中所包含的与目标变量相关的关联变量合并后作为各条执行语句的关联变量集,并进一步将各条执行语句的关联变量集合并后得到目标代码的关联变量集。服务器130在执行程序中的变量追踪方法时,也可以直接将目标代码的所有执行语句所包含的与目标变量相关的关联变量合并后得到目标代码的关联变量集。
137.需要说明的是,图9所示的函数仅是本公开所述的目标代码中的一种类型,不对本公开所述的目标代码具有限定作用。在其他示例中,目标代码中还可包含成员变量和/或静态变量。因而,目标变量和关联变量中均可以包括成员变量和/或静态变量,相应的,目标变量的关联变量集中也可以包括成员变量和/或静态变量。例如,如图13所示的代码定义了一个类,类名为sourceclass,且sourceclass下包含两个函数:objectpropertiestest3和objectpropertiestest5。若以图13所示出的全部代码作为目标代码,并指定目标变量为静态变量(property1),则按照如前所述的变量追踪方法,可以确定目标代码第147行,执行语句“property1=y0”中出现了变量传递关系property1《-y0,则执行语句“property1=y0”中与目标变量(property1)相关的关联变量为:变量y0,该变量同时也是函数objectpropertiestest3的入参。此外,目标代码第149行,执行语句“y=property1”中出现了变量传递关系y《-property1,则执行语句“y=property1”中与目标变量(property1)相关的关联变量为:变量y。在上述分析的基础上,将每一条执行语句中的关联变量合并后,即可得到目标代码中与目标变量(property1)相关的关联变量集。该关联变量集中包括:变量y0和变量y。
138.应当理解,图13所示出的代码中,还可以指定其他变量作为目标变量进行变量追踪,如目标变量还可以是成员变量property0、成员变量property2、入参x0、入参y0、入参z0中的至少一种。在此不一一赘述。
139.在一些实施例中,可以将所述关联变量集存储为所述目标变量在所述目标代码中
的目标分析结果。以便将来该目标代码被调用时直接根据该目标代码的目标分析结果确定调用该目标代码的目标分析语句的变量传递关系,从而极大提高变量追踪的效率。
140.应当理解,目标分析结果可以根据目标代码的范围进行调整。当目标代码为一个独立的函数时,目标分析结果包括该函数中与目标变量相关的关联变量。当目标代码中包含多个函数时,各个函数的目标分析结果汇总后即可得到整个目标代码中与目标变量相关的关联变量。
141.本公开中,想确定目标代码中所包含的变量是否和目标变量相关,需要观测所有变量。而在运行某个函数的时候,可能会对变量赋值。当函数结束后,有些对象会销毁(对应的变量不存活),有些对象会因为jvm(虚拟机)的内存机制继续存在(对应的变量存活)。因此,在一些实施例中,为了便于记录目标代码中所包含的变量与目标变量之间是否相关,可以定义一个长度为n的数组,其中,数组中的每一个元素代表一个变量;并且,定义“1”表示该变量与目标变量相关齐全存活,定义“0”表示该变量与目标变量不相关或者不存活。
142.例如,以图9所示的函数为例,该函数中包含的变量为:变量x、变量y和变量z。定义一个长度为3的数组array,其中,array[0]代表x,array[1]代表y,array[2]代表z。当目标变量为z时,对于执行语句“return z”,由于目标变量y为该函数的返回值,因而,根据控制流图可知,执行语句“return z”的第一关联变量为空,即执行语句“return z”的第一关联变量的状态为[0,0,0];根据执行语句“return z”的变量传递关系,可得该执行语句的第二关联变量的状态为[0,0,1]。
[0143]
由于目标变量z为该函数的入参,因而,根据控制流图可知,执行语句“return z”的第二关联变量为执行语句“z=z+1”或“z=z-10”的第一关联变量。对于执行语句“z=z+1”,其第一关联变量的状态为[0,0,1];根据执行语句“z=z-10”的变量传递关系,可得该执行语句的第二关联变量的状态为[0,0,1]。对于执行语句“z=z-10”,其第一关联变量的状态为[0,0,1];根据执行语句“z=z-10”的变量传递关系,可得该执行语句的第二关联变量的状态为[0,0,1]。
[0144]
相应地,根据图10所示的控制流图可知,执行语句“x=y+1”的第一关联变量为执行语句“z=z+1”和“z=z-10”合并后的第二关联变量,即执行语句“x=y+1”的第一关联变量的状态为[0,0,1],根据执行语句“x=y+1”的变量传递关系(执行语句“x=y+1”中仅存在变量x和变量y之间的传递关系,不存在与变量z的传递关系),可得该执行语句的第二关联变量的状态为[0,0,1]。
[0145]
同理,根据图10所示的控制流图可知,执行语句“z=x+1”的第一关联变量为执行语句“x=y+1”的第二关联变量。对于执行语句“z=x+1”,其第一关联变量的状态为[0,0,1];根据执行语句“z=x+1”的变量传递关系,可得该执行语句的第二关联变量的状态为[1,0,0]。
[0146]
在一些实施例中,步骤s324,还包括:
[0147]
确定在所述输入状态下所述目标分析语句中所述第一关联变量之间的第一传递关系;以及基于所述变量传递关系和所述第一传递关系,确定在所述输出状态下所述目标分析语句中所述第二关联变量之间的第二传递关系。
[0148]
对于某一个目标分析语句,当该目标分析语句的第一关联变量和/或第二关联变量所对应的变量个数不低于两个,且变量之间存在传递关系时,可以将第一关联变量之间
的传递关系以及第二关联变量之间的传递关系记录下来。本公开中,第一传递关系表示目标分析语句在输入状态下所包含的第一关联变量之间的传递关系;第二传递关系表示目标分析语句在输出状态下所包含的第二关联变量之间的传递关系。例如,如果某一目标分析语句在输入状态下存在第一变量传递关系:p0《-v,即变量v对变量p0传递了污点;如果该目标分析语句中存在变量传递关系:v《-p1,则该目标分析语句的第二变量传递关系为:v《-p1和p0《-p1。
[0149]
本公开中,变量之间的传递关系也可称为变量之间的污点传递关系。在一些实施例中,需根据目标分析语句的具体内容来更新污点传递关系。
[0150]
例如,当目标变量为入参z时,对于某一目标分析语句,其在输入状态下存在第一传递关系:z《-y,该目标分析语句中存在赋值关系:y=x0 op x1(op表示运算符)。此时,需清除第一传递关系中变量y原先的污点传播关系,将x0,x1和入参z的传递关系传递给变量y,分析完成后该目标分析语句在输出状态下的第二传递关系为:z《-x0,x1。
[0151]
例如,当目标变量为返回值、成员变量和静态变量中的至少一种时,为了便于描述,此处将返回值、成员变量或静态变量中的至少一种用变量z表示。对于某一目标分析语句,其在输入状态下存在第一传递关系:z《-y,该目标分析语句中存在变量传递关系:y《-x0,x1。此时,需将x0,x1和变量z的传递关系传递给变量y,分析完成后该目标分析语句在输出状态下的第二传递关系为:z《-x0,x1,以及y《-x0,x1。
[0152]
因而,在对目标分析语句的污点传递关系进行更新时(也即确定目标分析语句的第二传递关系时),需根据目标变量的属性确定是否需要保留该目标分析语句的变量传递关系。当目标变量为入参时,若不删除目标分析语句的变量传递关系,会导致误报。因此,需要删除目标分析语句自身存在的变量传递关系。当目标变量为返回值、成员变量和静态变量中的至少一种时,由于目标分析语句的第一传递关系为与目标分析语句相邻的下一层执行语句的第二传递关系经合并后所得,此时,目标分析语句的第二传递关系中即便不删除该目标分析语句自身存在的变量传递关系,也不会在分析过程中造成误报。
[0153]
在一些实施例中,可以将目标分析语句中与目标变量相关的第一传递关系、变量传递关系和第二传递关系中的至少一种存储为该目标分析语句的目标分析结果。还可以将目标代码中的每一条执行语句所对应的目标分析结果合并后存储为目标代码中与目标变量相关的目标分析结果。以便将来该目标代码被调用时直接根据该目标代码的目标分析结果确定调用该目标代码的目标分析语句的变量传递关系,从而极大提高变量追踪的效率。
[0154]
应当理解,目标分析结果可以根据目标代码的范围进行调整。当目标代码为一个独立的函数时,目标分析结果包括该函数中与目标变量相关的关联变量。当目标代码中包含多个函数时,各个函数的目标分析结果汇总后即可得到整个目标代码中与目标变量相关的关联变量。
[0155]
在一些实施例中,在步骤s324之后,还包括:
[0156]
确定所述目标分析语句存在历史第二关联变量;将所述目标分析语句在本轮得到的当前第二关联变量与所述历史第二关联变量进行比对。
[0157]
如前所述,在进行程序中的变量追踪时,会从目标分析队列的队头依次取出一条执行语句作为目标分析语句,随后进行变量追踪确定该目标分析语句中与目标变量相关的第二关联变量。本公开中,当对目标分析语句分析完成后,得到本轮分析对应的第二关联变
量,此时,可根据本轮分析所得的第二关联变量与之前采用相同的方法分析所得的第二关联变量判断该目标分析语句是否需要迭代分析。为了便于区分,将目标分析语句在本轮所得的第二关联变量称为当前第二关联变量;将目标分析语句在本轮之前所得的第二关联变量称为历史第二关联变量。
[0158]
当确定目标分析语句的所述当前第二关联变量与所述历史第二关联变量不同时,将所述当前第二关联变量作为所述目标分析语句在本轮的关联变量;再获取目标代码中与所述目标分析语句相邻的执行语句作为关联执行语句,将所述目标分析语句与所述关联执行语句加入所述目标分析队列的队尾。
[0159]
目标分析语句的当前第二关联变量与历史第二关联变量不同,表明该目标分析语句需要进行迭代分析。由于该目标分析语句的第一关联变量和第二关联变量对与该目标分析语句相邻的执行语句的第二关联变量具有影响。因此,本公开中,除了将该目标分析语句加入目标分析队列的队尾,还需将与该目标分析语句相邻的执行语句(即关联执行语句)加入目标分析队列的队尾。
[0160]
当确定目标分析语句的当前第二关联变量与历史第二关联变量相同时,则可将所述当前第二关联变量或所述历史第二关联变量作为所述目标分析语句在本轮的关联变量。
[0161]
在一些实施例中,当目标代码中包含多个代码块(函数)时,多个函数之间存在调用与被调用的关系,此时,可根据函数之间的调用与被调用关系创建能涵盖这些函数的调用关系网络。并且,可将每一个代码块看做一个独立的整体,对每一个代码块进行变量追踪得到每一个代码块中与目标变量相关的关联变量集(也即目标分析结果),该过程也可称为函数内分析。具体地,包括:识别所述目标代码中包含的代码块,每一个代码块对应一个函数;创建所述代码块之间的调用关系网络,所述调用关系网络反映代码块之间的调用关系;将位于所述调用关系网络中的所有代码块排列成代码块分析队列,所述代码块分析队列包括第一队列和第二队列,所述代码块分析队列中的每一个元素对应一个代码块;依次从所述代码块分析队列的队头取出一个代码块,确定所述代码块中与所述目标变量相关的关联变量集。
[0162]
本公开中,目标分析队列和代码块分析队列的区别在于:二者中元素的类型不同。目标分析队列的每一个元素对应一条执行语句,代码块分析队列的每一个元素对应一个代码块。代码块分析队列的配置方法包括:将所述调用关系网络中的所有代码块作为第一代码块,将所述第一代码块排列成第一队列;提取所述调用关系网络中与sink函数相关的代码块作为第二代码块,将所述第二代码块排列成第二队列。
[0163]
需要注意的是,第一队列中包含调用关系网络中的所有代码块,而第二队列中仅包含调用关系网络中与sink函数相关的代码块。
[0164]
本公开中,所述确定所述代码块中与所述目标变量相关的关联变量集包括:将所述代码块分析队列的队头的代码块作为目标代码进行变量追踪,得到所述代码块中与所述目标变量相关的关联变量集;将所述关联变量集作为所述代码块在本轮的当前目标分析结果。本公开中,确定所述代码块中与所述目标变量相关的关联变量集的方法为:将所述代码块作为目标代码进行变量追踪。具体地,将所述代码块中的每一条执行语句作为目标分析语句,得到目标分析语句中与目标变量相关的第二关联变量,再将每条执行语句的第二关联变量合并后得到该代码块中与目标变量相关的关联变量集,也即该代码块的目标分析结
果。
[0165]
为了便于区分,将代码块在本轮所得的目标分析结果称为当前目标分析结果;将目标分析语句在本轮之前所得的目标分析结果称为历史目标分析结果。
[0166]
若该代码块在调用关系网络中属于被调用函数,则目标代码中调用了该代码块的其它代码块在进行变量追踪时,可以直接根据该代码块的关联变量集(目标分析结果)确定该代码块所在执行语句中的第二关联变量,而无需再对该代码块进行变量追踪。由此,可以实现函数间的变量追踪,还可以提高分析效率。
[0167]
在一些实施例中,函数内分析执行完毕后,还包括:更新所述目标代码的目标分析结果。也即,将所述代码块在本轮的目标分析结果与所述代码块在上一轮的目标分析结果进行比对。具体包括:确定所述代码块存在历史目标分析结果;将所述代码块的所述当前目标分析结果与所述历史目标分析结果进行比对;以及确定所述代码块的当前目标分析结果与所述历史目标分析结果不同,将所述代码块的当前目标分析结果作为所述代码块在本轮的目标分析结果。
[0168]
当对代码块分析完成后,得到本轮分析对应的目标分析结果。此时,可根据本轮分析所得的目标分析结果与之前采用相同的方法分析所得的目标分析结果判断该代码块是否需要迭代分析。
[0169]
当确定所述代码块在本轮的目标分析结果与所述代码块在上一轮的目标分析结果不同时,表明该代码块需要进行迭代分析。将所述目标代码的目标分析结果更新为所述代码块在本轮的目标分析结果。并从所述调用关系网络中查找与所述代码块具有调用关系的相关代码块;将所述代码块和所述相关代码块添加至所述代码块分析队列的队尾。
[0170]
由于该代码块的目标分析结果会影响调用了该代码块的代码块的目标分析结果。因此,本公开中,除了将该代码块加入代码块分析队列的队尾,还需将调用了该代码块的所有代码块(相关代码块)加入代码块分析队列的队尾。
[0171]
s330,输出所述关联变量集。
[0172]
在一些实施例中,在步骤s330之后,还包括:
[0173]
s340,输出所述目标变量。
[0174]
所述输出的方式包括可视化展示。具体的,所述可视化展示包括语言列表显示和高亮显示中的至少一种。
[0175]
可视化展示可以是直接在客户端的显示界面上对目标代码中的目标变量和/或与目标变量相关的关联变量集中所包含的关联变量进行高亮显示。当然,除了高亮显示,也可以是边框、下划线、阴影、加粗等标记形式,又或者是两种或多种标记类型的结合。只要能将目标变量和/或与目标变量相关的关联变量集中所包含的关联变量区别于目标代码中的其他内容的展示形式均在本公开的保护范围之内,在此不一一例举。
[0176]
在一些实施例中,基于图5所展示的代码,函数名分别为sinktest0和sinktest的两个函数均调用了sink函数。如图6所示,图5所展示的代码中对sink函数传递了污点的关联变量集中包括:入参x、入参y、入参z、局部变量x、局部变量y和局部变量z。客户端110的显示界面中显示入参x、入参y、入参z、局部变量x、局部变量y和局部变量z被边框标记。
[0177]
在一些实施例中,如图11所示,基于图10所展示的函数,当目标变量为返回值z时,通过本公开的技术方案进行变量追踪后,确定返回值z的关联变量集中包括:局部变量z和
入参x。客户端110的显示界面中显示变量z、局部变和入参x被边框标记。并且,由于目标变量为返回值z,客户端110的显示界面中变量z均被高亮显示。
[0178]
可视化展示也可以是通过文字语言列表的形式对目标代码中的目标变量和/或与目标变量相关的关联变量集中所包含的关联变量进行展示。例如,可以将目标变量、与目标变量相关的关联变量集中所包含的关联变量各自对应的行号、变量类型或变量名称进行展示。在一些实施例中,当采用文字语言列表进行展示时,可以写出局部变量对应的变量名称和行号;如果有静态变量、成员变量或者入参,则还可以写出对应的变量类型。
[0179]
在一些实施例中,如图7所示,基于图5所展示的代码。还可通过文字语言列表形式展示图5代码中对sink函数传递了污点的关联变量。
[0180]
在一些实施例中,如图9所示,基于图6所展示的函数,当目标变量为返回值z时,可通过文字语言列表形式展示和返回值z相关的关联变量和语句。其中,args表示变量类型为入参。
[0181]
在一些实施例中,采用文字语言列表的形式进行展示时,还可以将关联变量集中的关联变量之间的传递关系进行展示。如图14所示,基于图13所展示的代码,图14中列出了对代码中的所有静态变量、成员变量传递了污点的关联变量以及关联变量间的传递关系。
[0182]
由此,通过对目标代码中的目标变量进行分析,以追踪目标代码中与目标变量相关的关联变量,并对目标变量和与目标变量相关的关联变量集中的关联变量进行可视化展示,可以清楚的显示目标变量在目标代码中的传递关系,从而便于开发人员在ide进行编码时,注意到与目标变量有关联关系的变量,提高代码的健壮性。
[0183]
本公开提供的技术方案中,目标变量可以由开发人员通过客户端110进行指定。例如,开发人员可以将鼠标指向某一变量,若被指向的变量为入参、成员变量、静态变量或返回值中的一种,处理器130将该被指向的变量作为目标变量,并进行变量追踪,确定与目标变量相关的关联变量集,进而对该目标变量和/或与目标变量相关的关联变量集中所包含的关联变量进行可视化展示。当然,目标变量也可以由开发人员通过其他方式进行指定,在此不一一赘述。
[0184]
在一些实施例中,还包括:s350,将所述关联变量集存储为所述目标变量在所述目标代码中的目标分析结果。
[0185]
如前所述,当目标代码中存在函数调用情况时,如果被调用函数具有对应的目标分析结果,则可直接基于被调用函数的目标分析结果确定目标分析语句的变量传递关系,这样可大大提高变量追踪效率。本公开中,将关联变量集存储为目标变量在目标代码中的目标分析结果。应当理解,目标分析结果中除了包含关联变量集,还可以包含关联变量集中各变量之间存在的传递关系。
[0186]
采用本公开所述的变量追踪方法可以对目标代码中的各种类型的变量进行追踪,并确定与目标变量相关的关联变量。下面将分别对目标变量为入参、成员变量、静态变量和返回值时,或目标代码中含有sink函数,以及目标代码中存在函数调用或者递归时,所对应的变量追踪流程进行展示。应当理解,本公开的变量追踪方法所涉及的分析流程均满足循环不动点定理。
[0187]
入参分析:当目标变量为入参时,运行某个函数后,确定哪些成员变量/入参/静态变量会对入参传递污点。如图15所示的代码中,对于函数名为“paramstest”的函数,其含有
两个入参:入参v0和入参v1。且函数名为“paramstest”的函数中调用了函数名为“getstr”的函数和函数名为“setstr”的函数。按照本公开所述的变量追踪方法,可以确定函数名为“paramstest”的函数中,当目标变量为入参v0时,与目标变量(即入参v0)相关的关联变量为:入参v1(位于第115行)。当目标变量为入参v1时,与目标变量(即入参v1)相关的关联变量不存在。
[0188]
此外,如图16-19所示,本公开还提供了入参分析所对应的流程图。其中,a、b、c模块分别对应入参分析前预设的三种处理方法。主动污点变量表示目标代码中向其他变量传递了污点的变量;主动污点变量包括:主动污点入参、主动污点成员变量、主动污点静态变量。被动污点变量表示目标代码中被其它变量传递了污点的变量,被动污点变量包括:被动污点入参、被动污点成员变量、被动污点静态变量。
[0189]
成员变量/静态变量分析:当目标变量为成员变量或静态变量时,运行某个函数的过程中,可能会对静态变量或者某个对象的成员变量赋值。当函数结束后,有些对象会销毁,有些对象会因为jvm的内存机制继续存在。需确定哪些入参/成员变量/静态变量会对函数结束后未销毁的对象的成员变量/静态变量传递污点。如图20-23所示,本公开提供了成员变量/静态变量分析所对应的流程图。其中,d、e、f模块分别对应成员变量分析前预设的三种处理方法。
[0190]
sink分析:如果一个函数是sink函数,那么这个函数的入参的污点会被作为结果输出。在运行某个函数的过程中,需确定函数中哪些入参或者外部的成员变量/静态变量的污点会最终作为入参传递到任何sink函数中。如图24所示,本公开提供了sink分析所对应的流程图。
[0191]
返回值分析:当目标变量为返回值时,运行某个函数后,需确定哪些入参或者外部的静态变量/成员变量的数值的污点会传递到返回值中。如图25所示,本公开提供了返回值分析所对应的流程图。
[0192]
函数间分析:当目标代码中存在函数调用或者递归时,采用如图26所示的操作流程示意图进行变量追踪。
[0193]
综上所述,在阅读本详细公开内容之后,本领域技术人员可以明白,前述详细公开内容可以仅以示例的方式呈现,并且可以不是限制性的。尽管这里没有明确说明,本领域技术人员可以理解本公开意图囊括对实施例的各种合理改变,改进和修改。这些改变,改进和修改旨在由本公开提出,并且在本公开的示例性实施例的精神和范围内。
[0194]
此外,本公开中的某些术语已被用于描述本公开的实施例。例如,“一个实施例”,“实施例”和/或“一些实施例”意味着结合该实施例描述的特定特征,结构或特性可以包括在本公开的至少一个实施例中。因此,可以强调并且应当理解,在本公开的各个部分中对“实施例”或“一个实施例”或“替代实施例”的两个或更多个引用不一定都指代相同的实施例。此外,特定特征,结构或特性可以在本公开的一个或多个实施例中适当地组合。
[0195]
应当理解,在本公开的实施例的前述描述中,为了帮助理解一个特征,出于简化本公开的目的,本公开有时将各种特征组合在单个实施例、附图或其描述中。或者,本公开又是将各种特征分散在多个本公开的实施例中。然而,这并不是说这些特征的组合是必须的,本领域技术人员在阅读本公开的时候完全有可能将其中一部分特征提取出来作为单独的实施例来理解。也就是说,本公开中的实施例也可以理解为多个次级实施例的整合。而每个
次级实施例的内容在于少于单个前述公开实施例的所有特征的时候也是成立的。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1