练习:程序切片
1 简介
注:问题3提到了conditioned slicing。 我们没有给出计算条件切片的算法,但你不应该要求这样的算法。
2 问题 1
对于以下每个代码片段,绘制程序依赖图(没有定义顺序边)。 基于这些,生成变量 x 的静态后端切片和 x 初始值的前向切片。
a)
1. y=z+1;
2. if (y>0)
3. x=x+1;
else
4. x=x+2;
b)
1. if (x>0)
2. x=x+1;
else
3. x=x+2;
4. if (y>0)
5. x=y;
else
6. x=-y;
7. z=x+1;
c)
1. while (y>0){
2. y=y-1;
3. x=x+1;}
4. z=x+y;
d)
1. while (x>0)
{
2. x=x+y;
3. y=y-1;
}
注意:在这些示例解决方案中,添加了一个节点以指示要对其应用末端切片的变量。 此外,不包括自环(从节点到自身的边)——这不会影响生成的切片。
For backward slice (a)
For forward slice (a)
For backward slice (b)
For forward slice (b)
For backward slice ©
For forward slice ©
For backward slice (d)
For forward slice (d)
程序的正向切片是指在程序的特定点直接或间接影响特定变量值的语句和变量的集合。 它有助于识别代码不同部分之间的依赖关系和关系。
在给定的代码片段中,前向切片仅包含语句“x = x + y”。 这意味着该语句是唯一直接影响程序中特定点处变量“x”值的语句。
让我们分析代码来理解为什么只有这条语句被包含在前向切片中:
- 代码以一个 while 循环开始,它的条件是变量 ‘x’ 大于 0。
- 在 while 循环内,执行语句“x = x + y”。 此语句通过向其添加“y”的值来修改“x”的值。
- 更新“x”后,使用语句“y = y - 1”将“y”的值减 1。
- 循环继续,直到条件“x > 0”不再为真。
由于直接影响“x”值的唯一语句是“x = x + y”,因此它是前向切片中包含的唯一语句。 循环中的其他语句,例如“y”的递减,不直接影响“x”的值,因此在这个特定上下文中不是前向切片的一部分。
3 问题 2
为变量 x 生成以下动态反向切片:
a) 上面的片段 a) 输入 x=1, y=5, z=2
在这里我们可以观察到,当我们到达 if 语句时,我们有 y=3,因此我们采用了“then”的情况。 因此,“else case”是无关紧要的,因此可以删除。 我们可能会产生如下一段代码:
y=z+1;
x=x+1;
b) 上面的片段 b) 输入 x=1, y=-1
这里当我们到达第一个 if 语句时 x 为正,当我们到达第二个 if 语句时 y 为负。 此外,最后一条语句 (z=x+1) 对 x 的值没有影响,因此可以删除。 因此,我们可能会得到以下动态切片:
x=x+1;
x=-y;
但是,我们现在可以从中删除第一条语句,因为它不会影响 x 的最终值(此处分配的值将被下一条语句分配的值覆盖)。 最后我们得到:
x=-y
c) 上面的片段 c) 输入 x=1, y=-2, z=3
因为当我们到达循环时 y 是负数,所以我们没有进入它的主体。 我们可能因此删除循环和它的主体给我们留下一个空程序:我们可以
删除片段的每个部分。
4 问题 3
给定下面的代码,为变量 x 生成以下条件切片:
a) x初值小于0条件下的end backward slice
b) y初值为0 while (x>0)条件下的end backward slice
1. while (x>0)
{
2. y=x*y;
3. x=x-1-y;
}
a) 当 x 最初为负时,我们不进入循环体,因此可以将其移除。 这导致空程序。