对于职业我们要有梦想,不抛弃不放弃。人生才会有乐趣。
程序结构分析之数据流分析
上一篇 /
下一篇 2010-12-15 09:03:24
/ 个人分类:测试基础
数据流分析最初是随着编译系统要生成有效的目标码而出现的,这类方法主要用于代码优化。近年来数据流分析方法在确认系统中也得到成功的运用,用以查找如引用未定义变量等程序错误。也可用来查找对以前未曾使用的变量再次赋值等数据流异常的情况。找出这些错误是很重要的,因为这常常是常见程序错误的表现形式,如错拼名字、名字混淆或是丢失了语句。这里将首先说明数据流分析的原理,然后指明它可揭示的程序错误。
1、数据流问题
如果程序中某一语句执行时能改变某程序变量V的值,则称V是被该语句定义的。如果一语句的执行引用了内存中变量V的值,则说该语句引用变量V。例如,语句
X: = Y + Z
定义了X,引用了Y和Z,而语句
If Y > Z then goto exit
只引用了Y和Z。输入语句
READ X
定义了X。输出语句
WRITE X
引用了X。执行某个语句也可能使变量失去定义,成为无意义的。例如,在PORTRAN中,循环语句PO的控制变量在经循环的正常出口离开循环时,就变成无意义的。
图5给出了一个小程序的控制流图,同时指明了每一语句定义和引用的变量。可以看出,第一个语句定义了3个变量X、Y和Z。这表明它们的值是程序外赋给的。例如,该程序是以此三变量为输入参数的过程或子程序。同样,出口语句引用Z表明,Z的值被送给外部环境。
该程序中含有两个错误:
① 语句2使用了变量W,而在此之前并未对其定义。
② 语句5、6使用变量V,这在第一次执行循环时也未对其定义过。
此外,该程序还包含两个异常:
③ 语句6对Z的定义从未使用过。
④ 语句8对W的定义也从未使用过。
当然,程序中包含有些异常,如③、④也还会引起执行的错误。不过这一情况表明,也许程序中含有错误;也许可以把程序写得更容易理解,从而能够简化验证工作,以及随后的维护工作(去掉那些多余的语句一般会缩短执行时间,不过在此我们并不关心这些)。
目前通过编译器或程序分析工具通过数据流分析可以查找出对未定义变量的使用和未曾使用的变量定义。
3、数据流分析应用的其它方面
在优化的编译系统中,数据流分析除去用于前已说明的以外,还用于多种目的。一个常数传播的例子是:如果变量V的所有定义(该定义达到引用V的一个特定语句)都把同一已知常数赋给该变更,对V的引用便可用这一常数所代替。这里是一个普通的例子。程序段:
a : = 4
b : = a +
…
c : = 3 * ( a + b )
可以用下列程序段代替:
a : = 4
b : = 5
…
c : = 27
常数传播除去能节省执行时间外,还能提高程序正文的清晰性,确认系统可以表明进行这种修改的可能性。
另一个例子是找出循环内的不变定义。这种定义并不引用其值在执行循环时可改变的任何变量。在优化的编译系统中查找不变定义是很重要的,因为它可使得将这一定义从循环中移出,放在循环前面或是放在循环后面,从而减少它的执行次数。在程序确认中,我们也对不变定义感兴趣,因为它会提醒他们注意粗心的程序设计。
收藏
举报
TAG: