整理了很久很久的一篇文章,觉得有收获的可以点个赞点个关注哇!!!有问题也可以评论或找我交流,有评论必回复!

目录

一、基础知识概念:

关于控制流信息有如下几个基本概念

1、基本块:

2、控制流图(cfg)

3、有向图G

基于数据流分析的一些定义:

1、到达与可到达的定义

2、变量定义和引用概念:

程序依赖图的相关定义:

二、程序切片的具体实现

1、静态切片:

基于图可达性算法的切片方法

2动态切片

代码片段及其程序依赖图示例

基于程序依赖图的动态切片方法

动态依赖图(DDG)

切片准则包含两个要素


程序切片是一种重要的程序分解技术,有助于使用者增强对程序内部结构、数据处理流程的理解,是程序分析方法的重要研究方向之一,在软件调试、软件维护和软件测试等领域有着广泛的应用。
程序切片作为一种程序分析基础方法也应用于软件安全分析领域中,在程序和网络协议逆向、软件漏洞成因和机理分析、软件漏洞利用自动生成等领域也发挥了重要作用。
简单来说,程序切片就是从庞大的程序代码中分解出我们的需要的部分来进行研究和分析。

程序代码是由计算机操作指令按照一定顺序组成的序列,基于该序列可以直接获取两类信息:
控制流信息
数据流信息
这两类信息是实现程序切片所依赖的最重要的信息。

一、基础知识概念:

关于控制流信息有如下几个基本概念

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>。
语句3对变量a进行定义,且语句4和5均未对变量a进行定义,那么,语句3就是代码位置P4、P5和P6的一个可到达定义。

简单一点来说,一个赋值语句a在他的赋值被更改前运行的所有语句的有一个可到达定义a。

2、变量定义和引用概念:

Def(x):

假定某个变量为x,则x有定义集Def(x),表示定义x的所有语句的集合,该集合包含任何使x的值发生变化的语句(例如,简单的或者经过运算后的赋值语句等)。

Use(x):

Use(x)表示变量x的引用集,即,任何使用x的语句的集合。

  • 分别将基本块内所有变量的定义集和引用集做并集,即可得到对应基本块的定义集和引用集

假定某条语句用s表示,s包含的变量定义和引用可以引入如下定义:

Gen(s):

产生集Gen(s)
表示所有由s给出的变量定义所在的语句构成的集合。

Kill(s):

杀死集Kill(s)
若s重新定义变量x,而x此前由语句s’定义,则称s消灭定义s’。
所有由s消灭的定义的集合称为s的消灭集。

In(s):

入集In(s)
表示所有在语句s之前仍然有效(没有被消灭)的定义语句的集合。

出集Out(s)

表示所有离开语句s的定义语句的集合,添加s产生的语句,同时去掉语句s所消灭的定义语句。

程序依赖图的相关定义:

1、控制依赖关系

设a和b为某程序CFG的两个节点,若b是否能执行取决于a的执行结果,则称b控制依赖于a,记作b→cda。

控制依赖关系与控制流图中节点连接关系的不同之处

通俗地说,若b控制依赖于a,则要求a与b之间可达,a至少有两个直接后继节点。
显然,若节点b是节点a的唯一直接后继,则b并不控制依赖于a

2、数据依赖关系

表示程序中引用某变量的基本块(或者语句)对定义该变量的基本块的依赖,即,是一种“定义-引用”关系。
设a和b分别为程序P的控制流图G中的两个节点,v为P中的一个变量,若a和b满足下列条件,则称b关于变量v直接数据依赖于a,记为b→dpa。
a对变量v进行定义,即,v ∈ Def(a);
b中引用了变量v,即,v ∈ Use(b);
a到b有一条可执行路径,且在此路径上不存在语句对v进行定义。
显然,若节点u是数据依赖于节点v的,则节点v是节点u的一个可到达定义。

3、程序依赖图PDG

依据控制依赖与数据依赖关系可以构建程序依赖图PDG,PDG由程序的控制依赖图和数据依赖图组成。


若Gc = (V, C),Gd = (V, D)分别为程序P的控制依赖图和数据依赖图,则程序依赖图Gp = (V, E),其中E = C ∪ D ∪ X,X表示程序中的其他依赖关系。

二、程序切片的具体实现

程序切片通常包括3个步骤

1、程序依赖关系提取
主要是从程序中提取各类信息,包括控制流和数据流信息,形成程序依赖图。
2、切片规则制定
主要是依据具体的程序分析需求设计切片准则。
3、切片生成
主要是依据切片准则选择相应的程序切片方法,然后对提取的依赖关系进行分析处理,从而生成程序切片。

程序切片的分类

按照是否在切片中考虑程序的具体输入,可以划分为静态切片和动态切片。
按照切片要提取的是对关注变量有影响的代码片段还是被关注变量所影响,可以划分为前向切片和后向切片。
按照提取的切片是否为可执行程序,可以划分为可执行的切片和不可执行的切片等。

1、静态切片:

目前,静态程序切片主要有两种方法
基于数据流方程的切片方法
基于程序依赖图可达性的切片方法
静态程序切片方法均是利用数据依赖和控制依赖关系进行分析以获得程序切片。

静态程序切片方法
基于数据流方程的切片方法
基于图可达性算法的切片方法

基于数据流方程进行切片的方法主要是通过迭代计算控制流图中每个节点的相关变量集合,迭代分析语句间的数据依赖关系和控制依赖关系,最终获得每条语句中与切片准则C相关的变量的集合。

但是这边个人认为图可达性方程更加简单方便,数据流方程的切片方法可以说是没啥用处,所以比较推荐图可达性算法的切片方法。

基于图可达性算法的切片方法

基于图可达性进行切片的方法与图遍历方法基本相同。
首先需要计算出目标程序的控制依赖和数据依赖关系,构建程序依赖图。
然后从切片准则所对应的节点出发,沿着数据依赖边和控制依赖边进行图遍历,所有遍历可达的节点均加入到切片中

这边其实最重要的一步是画出程序依赖图,这是静态切片的关键:

程序依赖图的制作

1、画出cfg

画cfg的时候只要有条件判断就加上T or F不用管它到底成不成立

2、画出augumented cfg 在cfg的基础上加上entry

3、reverse cfg

4、通过翻转cfg,目的是为了得到前向支配树(FDT),FDT+CFG就可以得到控制依赖图(CDG)了。

5、接下来我们需要做的就是cdg
其中首先我们要找到一个集合s,其中包含的是才cfg中存在的路径,但是fdt中不存在的路径

从而就能确认我们的控制依赖关系,我们认为如果b控制依赖于a,a控制依赖于entry,那么ab都控制依赖于entry。

6、在得到控制依赖图之后,我们再根据控制依赖图在上面做出数据依赖关系就能得到我们的程序依赖图了

切片举例:

基于依赖图的静态切片示例
针对切片准则<12, {z}>,切片计算从节点printf(“%d\n”, z);开始进行图遍历。
其中,以灰色填充的节点是遍历得到的节点,节点旁边的圆圈内的数字表示按照深度优先遍历的顺序。
最后得到的针对切片准则的后向切片为{3, 4, 6, 7, 10, 12}。

2动态切片

动态切片是一种仅关注在给定某个输入条件下对程序中某点的变量有影响的语句。
动态切片与静态切片的最大差异在于是否考虑了程序输入。
当考虑程序输入时,程序中的某些路径将不可达,从而能够确定程序依赖图的部分节点与切片准则不相关,可以从原始程序依赖图中删除这些节点以缩小图的规模。
与静态切片相比,通常动态切片给出的结果更有针对性,切片规模更小而且精确。

代码片段及其程序依赖图示例

采用静态切片方法中的基于图可达性的切片方法计算其切片,只需要从切片准则对应的节点开始遍历程序依赖图,并提取所有可到达的节点对应的语句。

代码片段针对<10, {y}>的静态切片示例
针对切片准则<10, {y}>,静态切片包括节点1、2、3、5、6、8和10。
切片中节点3、6和8是给y赋值的语句,均数据依赖于节点1,分别控制依赖于节点2和5,而节点2和5均数据依赖于节点1,因此,节点1中x的取值至关重要。
假设给定节点1中的x值为1,则节点1、2、5、8可达,而节点3、6不可达,在遍历程序依赖图以获取程序切片时可以忽略节点3和6,最终遍历裁剪后的程序依赖图获得的程序切片为{1, 2, 5, 8, 10}。

动态程序切片方法
基于程序依赖图的动态切片方法
基于动态依赖图的动态切片方法

基于程序依赖图的动态切片方法

基于程序依赖图的动态切片方法是通过裁剪程序依赖图来获得动态切片。
动态切片除了要考虑切片准则以外,还要考虑程序的具体输入。
当程序中某个未指定具体值的变量被赋予某个特定值时,程序运行能够得到一条由执行指令构成的动态执行路径,该执行路径称为执行历史。
执行历史示例
若给N指定一个具体值2,程序动态运行形成的执行历史可以表示为节点编号的序列:<1, 2, 3, 4, 51, 61, 71, 81, 52, 62, 72, 82, 53, 9>。
其中,节点编号有上标表示该节点在执行历史中不止一次出现,上标是其出现次数的递增编号,例如53表示当前是第3次执行语句5。

但上述动态切片方法存在的不足:产生的切片不够精确。

任何一个节点(语句)可能依赖于多个其他节点,这些依赖关系需要通过执行历史中的多条执行路径来体现,因此,执行历史中的执行路径虽然无法覆盖该节点与依赖节点之间的全部执行路径,但只要某个节点在执行历史中,则该节点关联的所有边对于图遍历都是有效边,仍然能够通过遍历执行历史没有覆盖的路径,把不相关节点也加入到切片中,导致最终获得的切片过大。

动态依赖图(DDG)

程序依赖图是一种静态表示,无法体现同一语句(节点)的不同次执行的区别。
动态依赖图(Dynamic Dependence Graph, DDG),不但能够表示静态程序依赖关系,同时也能表示程序的动态执行过程。

DDG的构造方法
遍历执行历史,依次为其中每个语句(节点)的每一次出现均创建一个新的节点;
同时,节点之间仅在因为程序执行而导致有实质的控制和依赖关系时才建立一条依赖边。

代码片段及其动态依赖图示例

当N=3,x依次取-4、3和-2时,执行历史为<1, 2, 31, 41, 51, 61, 81, 91, 101, 32, 42, 52, 71, 82, 92, 102, 33, 43, 53, 62, 83, 93, 103, 34>。
在动态依赖图中,3行节点对应于循环的3次执行,重复编号代表该节点所在语句的多次执行。
在前两次循环中,节点8依赖的节点不同
第一次循环时节点8引用的变量y是通过节点6的赋值语句定义的;
第二次循环时是通过节点7的赋值语句定义的。

基于DDG的动态切片计算比较简单,仅需要从切片准则对应的节点开始遍历动态依赖图,将所有可达到的节点都添加到切片中。
例如,针对上述代码片段,当N值为3,x值为-4、3和-2的条件下,针对切片准则<9, {z}, I0>的动态切片为{1, 2, 3, 4, 5, 6, 8, 9, 10}。

*切片准则包含两个要素

切片的目标变量

开始切片的代码位置 严格地说,程序P的切片准则是一个二元组<n, V>,其中n是程序中一条语句的编号,V是切片所关注的变量集合,该集合是P中变量的一个子集。

程序切片知识点整理(程序依赖图、静态切片、动态切片)相关推荐

  1. 程序动态切片技术研究

    摘 要 程序切片技术是一种重要的程序分析技术,广泛应用于程序的调试.测试与维护等领域.程序切片主要通过寻找程序内部的相关特性,从而分解程序,然后对分解所得的程序切片进行分析研究,以此达到对整个程序理解 ...

  2. 程序员笔试知识点整理

    程序员笔试知识点整理 0.常考基础必知必会 A. 排序:排序有几种,各种排序的比较,哪些排序是稳定的,快排的算法: B. 查找:哈希查找.二叉树查找.折半查找的对比,哈希映射和哈希表的区别? C. 链 ...

  3. 微信小程序调试webview_微信小程序内嵌webview相关知识点整理

    前言 随着微信小程序的广泛应用,越来越多的商家选择将营销阵营选择迁移到了小程序中,但受其小程序体积限制的影响,不能够完全满足商户的要求,应运而生的web-view组件很好的解决的这一问题.一方面内嵌w ...

  4. angr原理与实践(三)——Arbiter:一种弥合二进制程序漏洞发现中的静态和动态鸿沟

    转载请说明出处:信安科研人 please subscribe my official wechat :信安科研人 获取更多安全资讯 原文链接:sec22-vadayath.pdf (usenix.or ...

  5. 代码整理工具_程序员软件:程序员有哪些常用又好用的编码小工具?

    最近,有很多朋友让我帮忙整理一下程序员有哪些常用又好用的编码小工具.今天,小编就整理一下哦,希望大家一起学习,一起进步! 1. Notepad++ Notepad++中文版是一款非常有特色的编辑器,是 ...

  6. 计算机二级 java和web_2020年全国计算机二级WEB程序复习知识点:JavaBean

    [摘要] 即将参加全国计算机等级考试的考生们,考试即将到来,大家的备考工作进行得如何了?考必过为大家精心整理了2020年全国计算机二级WEB程序复习知识点:JavaBean,希望能够助力全国计算机等级 ...

  7. 软考程序员知识点总结(错题记录)

    1.IP地址:数字0.127作为地址开头是错误的 2.Cookies作用:服务器储存用户本地终端的数据 3.Dos(Denial of Service)攻击的目的:使计算机和网络无法提供正常的服务 4 ...

  8. vb计算机程序用到的知识点,2020年全国计算机二级VB复习知识点:程序的保存和装入...

    [摘要] 小编整理了2020年全国计算机二级VB复习知识点:程序的保存和装入的相关内容,下面一起来看看2020年全国计算机二级VB复习知识点:程序的保存和装入的具体内容吧,希望能够帮助到大家! 202 ...

  9. python程序设计基础考试重点_python语言程序设计基础 复习整理 第1-3章

    第一章 程序设计基本方法 1.1 计算机的概念 /计算机是根据指令操作数据的设备,具备功能性和可编程性两个基本特性. /摩尔定律:单位面积集成电路可容纳晶体管的数量约每两年翻一倍.翻倍翻倍翻倍翻倍.. ...

最新文章

  1. windows下tomcat日志输出至catalina.out文件
  2. Android AES加密算法,现在实际上
  3. java 动态规划视频_157-动态规划算法解决背包问题1
  4. std::vector 从大到小排序
  5. 【双11狂欢背后】微服务注册中心如何承载大型系统的千万级访问?
  6. CSS 布局 - Overflow
  7. 微信小游戏凭什么拿走开发者 70% 的日流水?
  8. F10-MYSQL的yum源码
  9. 管家婆财贸双全TOP系列服务器,管家婆财贸双全II
  10. Modbus RTU转Modbus TCP网关的应用
  11. JXLS (Excel 导出工具使用)
  12. python里面pop代码什么意思_python里的pop是什么
  13. 以后咱家客厅就得装修成这样!
  14. 【错误记录】Git 使用报错 ( error: The branch ‘feature1‘ is not fully merged. )
  15. ps软件修改图片中的文字
  16. Python实现图像直方图规定化(直方图匹配)-附完整代码
  17. 微信内置浏览器屏蔽网页链接怎么办,微信跳转外部浏览器的实现教程
  18. ajax put 请求
  19. 服务器维护中 verycd,强大的VeryCD服务器终于挂了...
  20. 世界是平的,网络也是平的

热门文章

  1. 艾美捷Cy3标记亲和纯化山羊抗大鼠IgG说明书
  2. 大文件 多路归并 排序
  3. CCC3.0学习笔记_数字钥匙系统架构
  4. java 子类调用静态方法吗_Java子父类中静态方法
  5. 网络安全工作需要具备的10种能力
  6. meteor check
  7. 深入ftrace function graph原理
  8. 区块链和环保的联手,能否让天灾不再可怕?
  9. Python之缓存刷新
  10. A.ZJH学长的茶叶(新生赛)