程序切片技术

来源:互联网 发布:手机聊天机器人软件 编辑:程序博客网 时间:2024/05/16 05:56

程序切片技术,是对程序的语句进行计算,将程序语句减少到只包含某个特定计算相关的。
和污点分析不同,程序切片关注代码指令,而污点分析关注于数据。

1. 切片类型

1.1 后向切片和前向切片

程序切片,按照方向可分为后向切片、前向切片、中间切片。

后向分片(Backward slice)

针对程序中某个点p,做后向分片,意识是切分所有影响p的语句。
例子:

int main(){int sum = 0;int i = 1;while (i<11) {sum = sum+i;i = i + 1;}printf(“%d \n”, sum);**printf(“d \n”, i);**}**The program subset that may affect printf(“d \n, i);**

前向分片(Forward slice)

针对程序中某个点p,做前向分片,意思是切分所有被p影响的语句。
例子:

int main(){**int sum = 0;**int i = 1;while (i<11) {sum = sum+i;i = i + 1;}printf(“%d \n”, sum);printf(“d \n”, i);}**The program subset that may be affected by sum = 0;**

1.2 静态切片和动态切片

按照切分对象,可分为静态切片和动态切片

静态切片

静态切片,是对源代码直接进行计算(通过数据和控制依赖)。
在程序P中,一个静态切片S包含所有可能影响某个点的变量v的语句。
比如:

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

针对write(sum)进行切片后:

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

动态切片

动态切片是对一个执行流进行切片。
在一个执行流中,动态切片包含所有实际影响某个点的变量v的语句。
考虑一个if-else语句,动态切片只包含执行的语句,静态切片包括if下的语句和else下的语句。

1.3 过程间切片和全系统切片

根据切片的范围,程序切片可分为:过程间切片和全系统切片。
过程间切片
过程间切片是在一个过程(函数)的内部进行切片。通常采用控制依赖和数据依赖生成一个PDG(Program Dependency Graph),通过PDG进行切分。
全系统切片
全系统切片是在整个系统中(多个过程)进行切片。每个过程内部都是一个PDG。之后通过给过程间增加边,生成SDG(System Dependency Graph)。过程见增加边的条件如下:

– Connect calls to entries– Connect actual parameters to formal parameters– Connect procedure results to call-site return values

这里写图片描述

2. 切片方法

切片的算法,可分为控制依赖、数据依赖。

控制依赖:
这里写图片描述

数据依赖:
这里写图片描述

两者结合:
这里写图片描述

使用控制依赖和数据依赖做后向切分:
这里写图片描述

0 0
原创粉丝点击