循环结构的数据流分析方法

一 引言

        在测试人员对代码文件进行静态分析过程中,数据流分析占有举足轻重的作用,很多重要的信息,比如不可达语句、DU、DD、UR…等都是基于数据流分析的结果而得出的。以往,数据流分析通常是由测试人员人工完成。测试者在理解代码逻辑的基础上,从被分析代码的起点跟踪数据的流向,直到到达被分析代码的终点。这项工作看起来简单,但是实际做起来却往往令测试人员感到非常头疼。主要原因有三点:1.数据的变化要随着路径长度的增加不断累积;2.分支条件要随着路径的增长不断累积,并且路径上每增加一个分支节点,都要在路径中最新的数据分析结果的基础上计算分支条件的值; 3.路径数通常随着代码规模的增长以几何级数的速度增长。无论是数据变化结果的累积还是分支条件的累积或者路径数的增长,当任何一个累计到一定数量的时候,对于人脑来说,在进行跟踪与分析就成为一件不可能完成的任务了。所以在实际的工作中,测试人员的通常做法就是尽力而为,能分析多少就分析多少。这就使很多隐藏在代码中的很多问题在测试人员面前逃之夭夭。

       随着计算机技术的不断发展,各行各业的信息化工作也进行得如火如荼。“让电脑代替测试人员进行数据流分析”也不断的被提到测试行业的信息化工作当中。然而却一直进展缓慢,始终达不到工程应用的水平。最主要的拦路石有两块:1 代码中的循环结构的数据流分析;2代码中的函数调用语句的数据流分析。本文阐述的分析方法能够准确高效的完成循环结构的数据流分析。关于函数调用语句的数据流分析方法在另外一篇文章中阐述。

二 基本概念

        在介绍具体方法之前,先交代涉及的主要的概念。代码的数据流分析,顾名思义就是对一段代码中从起点到终点数据流动的全过程进行分析。在数据流动的过程中,可能会出现数据定值,也可能会出现数据引用。同时,由于代码中有可能会存在多种分支语句,因此,从起点出发,会产生一条或者多条路径,每条路径中由多个节点组成,每个节点对应相应的约束条件,除此之外,每个节点还对应着到达该节点之前所有的变量应用的最终结果,我们将其称之为数据切片。随着路径长度的增长,约束条件不断累积,在到达终点之前,如果约束条件的取值为永假,则路径终止,此路径为不完整路径,如果顺利到达终点,则此路径为完整路径。由于本文阐述的是循环结构的数据流分析方法,所以有必要介绍循环相关的概念。循环的入口条件表达式如果是可计算的,或者循环中的跳出语句的约束条件集合是可求值的话,则循环为正常结束循环;否则的话,在数据流分析过程中,为了避免无意义的循环导致路径的无限延长,本文阐述的方法会设定一个阈值,如果不是正常结束循环,当循环次数超过阈值后,强制令循环终止,这样的循环称之为强制结束循环。循环中的语句和循环后的语句由于可能受到循环所造成的数据变化的影响,称之为循环相关语句。

三 循环结构的数据流分析

       对于没有循环结构和函数调用语句的代码段,目前已经形成了比较成熟的数据流分析方法,循环结构的数据流分析是对普通数据流分析方法的改进。

1 普通的数据流分析方法

        对于没有循环和函数调用的代码段,一般的数据流分析方法包括变量应用分析、构建块树、建立控制流图、遍历路径等几个步骤。

  • 变量应用分析

        在语法分析的基础上,对在代码中发生定值及引用的语句进行分析,并将定值及引用的变量及其具体值按照发生的顺序进行记录。注意,一定要按照顺序记录,因为不同的顺序会产生不同的数据结果。

  • 构建块图

        在词法分析、语法分析的基础上,以代码段起始点为根节点,分析代码段中各分支语句如if、else if、for、 while、case…等分支语句以及break 、exit、 return…等强制转向语句的层次关系及先后关系,从而构建成一颗树,通常会将带有函数调用的语句处理为普通语句,不做为单独的一个块来处理。

  • 建立控制流图

        在块树构建完成后,从根节点开始,以根节点作为源点,按照子块的先后顺序及层次关

系对子块进行分析,根据每个子块的具体类型建立其所有目标节点,所有块分析完毕后,将会构建成特定代码段的控制流图。

  • 遍历路径

        从控制流图的源点开始,使用深度优先搜索遍历图中所有路径,路径边上面的变量应用都要记录到数据切片上。以最新的数据切片为基础,在遍历的过程中不断计算各节点累积约束条件的逻辑值,计算并记录下每个节点对应的最新的数据切片,获取所关注的数据流分析结果。

2 循环结构数据流分析

       要对循环结构进行正确的数据流分析,前提是正确的绘制for,while, do,break, continue等循环相关块的控制流图。在此基础上,本文分别介绍正常结束循环和强制结束循环两种情况下的数据流分析方法。

  • 正常结束循环

       如果循环是正常结束循环,那么就按照正常的数据流分析即可。相较于普通的数据流分析方法,所不同就是路径随着循环次数的增加不断延长,直至循环结束。

  •  强制结束循环

       由于循环被强制结束,所以每条路径的最新的数据切片、约束条件集合都是不准确的。理论上说,循环相关的语句都是不能够进行正确的数据流分析了,包括循环中的语句和循环后的语句。可循环相关语句的数据流分析往往非常重要,所以只能尽力而为了。通过对循环结构内部的数据分析,我们能够获取循环内部数值可能会发生变化的变量集合,这个集合可以看成是当前强制结束循环所造成的数据结果。在路径遍历过程中,如果到达了循环相关语句中的分支语句,暂时可将循环视而不见,认为其不存在,对分支语句的分支条件进行变量分析,如果该条件中使用了循环内部的定值集合中的变量,则认为其可取任意值,不进行分支条件的数值检测,所有分支路径都遍历。如果该条件中没有使用循环内部的定值集合中的变量,则进行正常的数据流分析。如此,能够对强制结束循环的循环相关语句中的相当一部分进行必要的数据流分析。

四 具体应用

       测试之家开发的ufinder(不可达语句检测工具)V0.97中应用了上文阐述的对循环结构的数据流分析分析方法,相对于一般的数据流分析,在ufinder中对数据流分析进行了一定程度的简化,主要有两点:1.数据切片中仅仅存储变量的定值,而没有存储变量的引用;2.遍历过程中如果找到一条完整路径,说明存在一条可达路径,遍历过程立刻停止;通过实际工程应用的检验,本文阐述的方法确实能够准确高效且全面地对包含有函数调用语句的代码段进行数据流分析。

猜你喜欢

转载自blog.csdn.net/plstudio1/article/details/79643411