向后切片,正向切片和其他形式的切片
向后切片Backward Slices
假设我们希望确定哪些语句影响节点 n。
这是由 n 和在 n 处引用的变量。
我们只是:
从 n 回溯控制和流依赖边。
我们保留由此到达的节点。
一般后向切片
通常,我们的切片标准是一个节点和一个变量集 V。
PDG 可能不包含表示此切片标准的节点。
对于后向切片,我们可以:
在 n 之前添加一个新节点 n’; 让新节点 n’ 引用 V 中的变量
然后我们生成 PDG 并从中追溯依赖关系节点 n’。
正向切片Forward Slices
假设我们希望确定哪些语句受到影响由节点 n。
这是由 n 和分配给 n 的变量形成的标准的前向切片。
我们只是:
从 n 向前追踪控制和流依赖边。
我们保留由此到达的节点。
通用前向切片
通常,我们的切片标准是一个节点和一个变量集 V。
和以前一样,PDG 可能不包含代表这个切片标准。
对于前向切片,我们可以:
在n之前添加一个新节点n’;将新节点n’分配给V中的变量
然后我们生成 PDG 并从 n’ 向前跟踪依赖关系。
Backward PDG 和 Forward PDG 相同的原因:
在这个特定的程序中,后向 PDG 和前向 PDG 是相同的。 这是因为该程序不包含任何可以创建不同执行路径的循环或条件。 因此,无论分析方向如何,语句之间的数据和控制依赖关系都保持不变。
PDG 将显示以下依赖项:
- 输入语句 (1) 取决于 x 和 y 的值。
- 赋值语句 (2) 取决于 x 和 y 的值。
- if 语句 (3) 取决于 x 和 y 的值。
- if 和 else 块(4 和 5)内的赋值语句取决于 z、x 和 y 的值。
- 递增语句 (6) 取决于 x 的值。
- 输出语句 (7) 取决于 z 的值。
由于无论分析方向如何,语句之间的依赖关系都保持不变,因此在这种情况下,后向 PDG 和前向 PDG 将是等价的。
因此,对于给定的程序,由于没有复杂的控制流结构,后向 PDG 和前向 PDG 是相同的。
切片标准
在程序切片中,切片标准指的是计算切片的特定程序点或感兴趣的变量。 它定义程序中切片分析的起点,并确定生成的切片中包含哪些语句。
切片标准可以根据所需的结果和分析目标以不同的方式定义。 以下是一些常见的切片标准:
-
程序点准则:切片准则是代码中的特定语句或程序点。 切片包括所有直接或间接影响程序点执行或受其影响的语句。
-
变量准则:切片准则是代码中的特定变量。 切片包括所有直接或间接影响变量值计算或受变量值影响的语句。
-
控制流准则:切片准则是代码中特定的控制流条件,例如if语句或循环条件。 切片包括直接或间接影响控制流条件的评估或受其影响的所有语句。
-
数据流准则:切片准则是代码中特定的数据流依赖关系,例如变量的赋值或使用。 切片包括所有直接或间接影响变量数据流或受其影响的语句。
切片标准的选择取决于具体的分析目标和感兴趣的信息。 通过定义切片标准,分析可以集中在与该标准相关的相关语句和依赖项上。 生成的切片提供了原始程序的一个子集,该子集捕获与切片标准相关的依赖关系和行为,有助于各种软件工程任务,例如调试、程序理解和代码优化。
其他形式的切片
动态切片Dynamic Slicing
在动态切片中,我们将输入作为切片的一部分标准。
我们可能会问:
什么语句影响节点 n 处 V 中变量的值,假设输入是 s(一些已知的 s)?
在动态(向后)切片中,我们可以删除不影响该输入的切片标准的语句。
当我们说某些语句不影响动态(向后)切片中特定输入的切片标准时,这意味着从程序中删除或删除这些语句不会改变导致满足切片标准的计算或行为或 为该输入触发。
通过删除不影响切片标准的语句,生成的动态切片变得更小,并且更专注于直接有助于观察到的行为的程序的基本部分。 这有助于代码的调试、优化和理解,因为不相关的语句被消除,开发人员可以专注于与切片标准相关的关键部分。
值得注意的是,确定哪些语句不影响切片标准可能是一项非常重要的任务,尤其是在不同部分之间具有依赖性和交互的复杂程序中。 各种技术,如数据流分析和程序依赖分析,被用来识别这些语句并有效地执行动态切片。
动态切片的好处:
据观察:
静态切片通常非常大。对于某些问题(例如调试),我们有实际的输入。通过包含此输入,我们可以获得更小的切片。
虽然使用输入信息进行动态切片可能是有益的,但请务必注意,在捕获和分析输入数据方面可能需要额外的开销。 此外,动态切片依赖于程序执行期间使用的实际输入的可用性,这可能并不总是可行或实用的。 因此,静态切片和动态切片之间的选择取决于具体场景和可用资源。
条件切片Conditioned Slicing
我们没有向切片标准添加输入,而是添加了输入条件。
例如,我们可能会问:
如果输入满足属性 x > 0?
更通用,但通常需要更复杂的工具才能生成。
非晶切片Amorphous Slicing
在无定形切片中,我们可以应用任何保留感兴趣的语义的简化步骤。
不只是语句删除。这可以允许更大的简化。
对于某些问题领域很有用,例如理解。
非晶切片示例: