整理了很久很久的一篇文章,觉得有收获的可以点个赞点个关注哇!!!有问题也可以评论或找我交流,有评论必回复!
目录
程序切片是一种重要的程序分解技术,有助于使用者增强对程序内部结构、数据处理流程的理解,是程序分析方法的重要研究方向之一,在软件调试、软件维护和软件测试等领域有着广泛的应用。
程序切片作为一种程序分析基础方法也应用于软件安全分析领域中,在程序和网络协议逆向、软件漏洞成因和机理分析、软件漏洞利用自动生成等领域也发挥了重要作用。
简单来说,程序切片就是从庞大的程序代码中分解出我们的需要的部分来进行研究和分析。
程序代码是由计算机操作指令按照一定顺序组成的序列,基于该序列可以直接获取两类信息:
控制流信息
数据流信息
这两类信息是实现程序切片所依赖的最重要的信息。
一、基础知识概念:
关于控制流信息有如下几个基本概念
1、基本块:
严格地说,基本块是满足下列条件的一组连续指令代码:
程序执行时,只能从该基本块的第一条指令进入该基本块。
程序执行时,离开该基本块前的最后一条指令必须是该基本块的最后一条指令。
举一个例子来详细说一说:
图(a)所示,代码5~6行与9~10行两个代码块有不同的进入条件,下一个执行代码块的选择取决于第4行的判断条件。
图(b)所示,第4行代码while语句包含第5行代码,该行代码与其他行代码分开,执行条件是第4行的判断语句。
图(c)所示,第4行代码for语句包含第5行代码,该行代码与其他行代码分开,执行条件是第4行的判断语句。
可见,被条件语句和循环语句包含的代码块有着共同的特点:
这些代码块由连续的语句构成,并且不包含可以离开当前代码块的语句。
即,该代码块执行只能从第一条语句开始,并且一直执行到该代码块的最后一条语句。
这样的代码块称为基本块。
此外,不允许从基本块外的指令跳转到基本块中间的某一条指令执行。
2、控制流图(cfg)
当程序被划分为基本块后,如果将基本块视为一个基本单元节点,基本块之间在程序执行流程上互为前驱和后继关系可以视为两个基本块之间存在一条边,则整个程序能够转换为一个有向图,称为控制流图(Control Flow Graph, CFG)。
其中,控制流是指程序基本块执行的流程。
程序指令到控制流图转换的示例
其中,左侧代码的基本块分别用数字进行编号,右侧有向图即为控制流图。
节点0是节点1和2的严格直接前必经节点,而节点3是节点1和2的严格直接后必经节点。
3、有向图G
根据基本块构造的有向图G可以表示为四元组G = {V, E, Entry, Exit},其中
V是基本块节点的集合
E是基本块之间边的集合
Entry表示入口基本块节点
Exit表示结束基本块节点
程序执行时,从Entry代表的基本块开始执行,沿着控制边遍历执行基本块,最后到Exit代表的基本块时执行结束。
基于数据流分析的一些定义:
1、到达与可到达的定义
针对变量x的一个定义语句s,称该语句对变量x的定义到达程序的某个代码位置P,当且仅当在程序控制流图(CFG)中存在从该定义对应的语句到位置P语句的一条路径,并且该路径上没有变量x的其他定义。
称语句s是代码位置P的一个可到达定义。
可到达定义示例
第2条语句对变量b赋值,在该语句执行后变量b的值被算术表达式a+1的值所替代。
另外,每条语句前后都有对应的代码位置标识,分别为P1, P2, P3, P4, P5, P6,程序执行时可能的路径为<P1, P2, P3, P4, P5, P6>或者<P1, P2, P3, P4, P1, P2, P3, P4, P5, P6>。