程序切片

计算机编程中,程序切片是对程序语句集的计算,该程序切片可能会在某个感兴趣的点上影响值,这被称为切片标准。程序切片可以用于调试以更轻松地定位错误源。切片的其他应用包括软件维护优化程序分析信息流控制

自马克·韦瑟(Mark Weiser)的原始定义以来,切片技术一直在看到快速发展。首先,切片仅是静态的,即,在源代码上应用,除了源代码外没有其他信息。 Bogdan Korel和Janusz Laski引入了动态切片,该切片适用于程序的特定执行(对于给定的执行跟踪)。还有其他形式的切片,例如路径切片。

静态切片

基于Weiser的原始定义,非正式地,静态程序切片由程序P中的所有语句组成,这些语句可能会影响语句x中变量V的价值。为切片标准c =(x,v)定义了切片,其中x是程序p和v中的语句,x在x中是可变的。一个静态切片包括所有可能影响任何可能输入的语句x的变量V值的语句。静态切片是通过语句之间的回溯依赖项来计算的。更具体地说,要计算(x,v)的静态切片,我们首先找到所有可以直接影响语句x遇到v的值的语句。递归地,对于可能影响语句x中V值的每个语句y,我们计算y中所有变量z的切片,影响所有这些切片的v。 。

例子

例如,考虑下面的C程序。让我们计算(写(sum),sum)的切片。如果n <= 1,如果n> 1和“ int sum = 0”,总和的值直接受“ sum = sum = sum + i + w”(int sum = 0”的影响。三片和没有依赖性的“ int sum = 0”语句:

  1. 切片(sum = sum + i + w,sum)
  2. ,
  3. 切片(sum = sum + i + w,i)
  4. ,
  5. 切片(sum = sum + i + w,w)
  6. , 和
  7. {int sum = 0}。

很容易看到切片(sum = sum + i + w,sum)由“ sum = sum + i + i + w”和“ int sum = 0”组成,因为这些是唯一可以影响值的先前语句总和为“ sum = sum + i + w”。同样,slice(sum = sum + i + w,i)仅包含“(i = 1; i <n; ++ i){”和slice(sum = sum = sum + i + w,w,w)仅包含语句“ int w = 7”。

当我们将所有这些语句结合时,我们没有可执行的代码,因此,要使切片成为可执行的切片,我们只是为for循环和i的声明添加了最终支架。生成的静态可执行切片如下下面的原始代码所示。

int i;
int sum = 0;
int product = 1;
int w = 7;
for(i = 1; i < N; ++i) {
  sum = sum + i + w;
  product = product * i;
}
write(sum);
write(product);

标准的静态可执行切片(write(sum),sum)是下面显示的新程序。

int i;
int sum = 0;
int w = 7;
for(i = 1; i < N; ++i) {
  sum = sum + i + w;
}
write(sum);

实际上,大多数静态切片技术,包括Weiser自己的技术,也将消除 write(sum) 陈述。因为在声明中 write(sum), 的价值 sum 不取决于陈述本身。通常,特定语句X的切片将包含多个变量。如果v是语句x中的一组变量,则(x,v)的切片是所有切片的与标准(x,v)的所有切片的结合,其中v是集合V中的变量。

轻巧的前向静态切片方法

出于多种原因,一种非常快速,可扩展但准确的切片方法稍微降低的切片方法非常有用。开发人员将具有非常低的成本和实用手段来估计几分钟之内变化的影响与天数。这对于计划实施新功能和了解变更与系统其他部分的关系非常重要。它还将提供廉价的测试,以确定是否有必要对系统进行完整,更昂贵的分析。快速切片方法将为指标研究的新途径和基于切片的历史开采。也就是说,切片现在可以在非常大的系统和整个版本的历史上进行。这为以前无法​​进行的许多实验和实证研究打开了大门。

动态切片

动态切片可利用有关程序的特定执行的信息。动态切片包含所有实际影响程序点上变量值的语句,以指定程序的特定执行,而不是所有可能影响程序点上变量值的说明,以实现该程序的任何任意执行。

阐明静态切片和动态切片之间差异的一个示例。考虑一小部分程序单元,其中有一个包含IF-ELSE块的迭代块。这两个陈述都有 ifelse 对变量产生影响的块。在静态切片的情况下,由于整个程序单元不论该程序的特定执行如何,因此两个块中受影响的陈述都将包含在切片中。但是,在动态切片的情况下,我们考虑了该程序的特定执行,其中 if 块被执行,并在 else 块不被执行。因此,这就是为什么在这种特定的执行情况下,动态切片仅包含 if 堵塞。

也可以看看