3D-CFG构建

写在前面的话

这篇文章详细描述了在 Achieving Accuracy and Scalability Simultaneously in Detecting Application Clones on Android Markets 这篇文章中新提出的一个东西,姑且就叫做centroids algorithm(质心算法)

1.一些概念

CFG是control flow graph的简写,在中文翻译叫做 * 控制流图 *

控制流图是程序依赖图(PDG program dependence graph)的一个部分.程序的依赖总共有两种一种是数据依赖(data dependency)另外一种是方法之间的相互调用关系,我们把这种关系叫做(control dependency)。

数据依赖(data dependency)指的是例如在一个代码块中存在着两条语句(statement)我们把这两条语句分别叫做S1和S2. S1当中有一个数据data1 它的取值完全是靠S2这条语句中的data2来决定的。比如说我们来看一段代码
》》》》》


int a;
int b;
....

if(b > 3)
    a = 2;
else
    a = 1;

从上面这段代码我们可以看出a的取值完全是依赖于b的取值的。

我们把具有数据依赖的这些调用关系构成的图叫做数据流图(data flow graph)

如果两条语句,其中一条语句的执行完全依赖于另一条语句的执行,那么我们把这种依赖的关系叫做控制依赖。由这种控制关系构成的图我们把它们叫做(control flow graph)

今天主要讲的就是控制流图(control flow graph)。

但是由于控制流图的英文缩写是CFG这里描述的是3D-CFG,表示的是3维空间的控制流图。

一个控制流图是一个方法,里面的每一个基本代码块语句我们把它们设置为一个节点。
具体的CFG更详细的讲解我们可以参看:
https://en.wikipedia.org/wiki/Control_flow_graph

  • 每个节点的语句块只能有一个入口一个出口
  • 不能含有goto语句,不能含有分支语句,不能还有循环语句

还有一篇比较好的blog,我们可以看这里:

程序控制流图链接

下面的内容均来自这篇博客:

1.1程序控制流图定义

定义 基本块:是一个最大化的指令序列,程序执行只能从这个序列的第一条指令进入,从这个序列的最后一条指令退出。

确定基本块的原则:
1) 遇到程序、子程序的第一条指令或标号语句,结束当前基本块,并将该语句作为一个新块的第一条语句。
2) 遇到goto语句、分支语句、循环语句,将该语句作为当前块的最后一条语句,并结束当前块。
3) 遇到其他语句直接将其加入到当前基本块。

定义 控制流图CFG(Control Flow Graph):是以基本块为结点的有向图G=(N, E),其中N是结点集合,表示程序中的基本块;E是边的集合,如果从块U的出口转向块V,则从U到V有一条有向边UàV,表示从结点U到V存在一条可执行路径,称U为V的前驱结点,V为U的后继结点。也就代表在执行完结点U中的代码语句后,有可能顺序执行结点V中的代码语句。

常见控制语句对应的控制流图:

这里写图片描述

看一段源程序:

int fib(int m)
{ int f0=0,f1=1,f2,i;
   if(m<=1){
  return m;}
   else
    { for(i=2;i<=m;i++)
       { f2=f0+f1;
          f0=f1;
          f1=f2;
       }
       return f2;
    }
}

中间表示:

 receive  m
      f0 ← 0
      f1 ← 1
      if m<=1 goto L3
      i2;
L1:if  i<=m goto L2
      return f2
L2:f2 ← f0+f1
      f0 ← f1
      f1 ← f2
      ii+1
      goto L1
L3:return  m

这里写图片描述

在这篇文章中,作者借用了物理学当中重心(centroid)的概念来迁移到我们的程序设计当中。在物

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值