Program Slicing
在计算机编程,程序切片是一组程序语句的计算,切片可用于调试以更容易地定位错误源。切片的其他应用包括软件维护,优化,程序分析和信息流控制。
自Mark Weiser最初的定义以来,切片技术一直在迅速发展。最初,切片只是静态的,即应用于源代码而没有除源代码之外的其他信息。Bogdan Korel和Janusz Laski介绍了动态切片,它适用于程序的特定执行(对于给定的执行跟踪)
静态切片 VS 动态切片
(1)静态切片
仅仅是静态可用的信息
没有对输入做任何假设
计算切片通常是不准确的
识别最小切片是一个不可确定的问题
结果可能并不有用
(2)动态切片
对给定的输入进行计算
实际而不是
适用于调试和测试等应用程序
Examples1:(static backward slice)
使用后向静态切片,关于程序点p和程序变量组V的程序的后向切片;关于程序点p和程序变量集V的程序的后向切片由程序中的所有语句和谓词组成,这些语句和谓词可能影响V中的变量值;程序点p和变量集V一起形成切片标准,通常写为<p,V>。
一般方法:向后遍历程序流程
切片从点p开始(C =(p,V))
检查可以执行的语句
在p之前(不只是在p之前出现的语句)
添加影响p的值或执行的语句以获得p
考虑传递依赖
程序执行方式:
如果切片中的语句形成可以执行的语法正确的程序,则切片是可执行的。
如果正确(安全地)计算切片,则运行作为可执行切片的程序的结果对于所有输入的V中的变量产生相同的结果。
执行结果:
Examples2:(Dynamic slice)
对于程序的特定执行e,关于程序点p处的变量v的输入值的程序的动态切片是程序中影响v的值的所有语句的集合。
程序点p,变量V和e的输入i形成切片标准,通常写为<i,v,p>。 切片使用输入i的程序的执行历史或轨迹。
Compare the static slice with dynamic slice
Method for computing slices
流程图上的数据流
过程内:控制流图(CFG)
过程间:过程间控制 - 流程图
依赖图中的可达性
过程内:程序依赖图(PDG)
过程间:系统依赖图(SDG)
数据流方程(CFG上的数据流)
迭代过程(通过CFG)
使用数据依赖性为CFG中的每个节点计算连续的“相关”变量集
不明确计算控制依赖性
控制谓词的变量(if,while)如果其身体中的任何一个陈述相关,则“间接相关”
从切片准则开始:C =(p,V)
继续,直到达到一个固定点(即,最后一次迭代没有找到新的相关语句)
关于一些程序分片的源码,可在github上参考:https://github.com/search?q=programming+slice