程序分析-对程序依赖图(PDG)的理解

程序依赖图,主要包括控制依赖图(CDG)和数据依赖图(DDG),在做程序切片时有重要作用。这里对它们的定义引用SySeVR论文中的话。

一.控制依赖

定义:(这里我对它的表达进行了一些简化,这里考虑的是一个函数内的情况):给定函数 f f f 的 CFG G = ( V , E ) G = (V, E) G=(V,E),以及2个结点 n i , n j n_i, n_j ni,nj(假定 j j j i i i 后面),并且 i ≠ j i \neq j i=j

  • 如果CFG中所有从 n i n_i ni 开始到 end 结点的路径都经过 n j n_j nj,那么称 n j n_j nj post-dominate n i n_i ni(后面的支配前面的)。

  • 如果存在CFG中存在一个从 n i n_i ni n j n_j nj 的路径,并且满足 n j n_j nj post-dominate 这个路径上除了 n i n_i ni n j n_j nj 之外的所有结点并且不post-dominate n i n_i ni。那么 n j n_j nj 控制依赖于 n i n_i ni

1.1.示例1

以下面伪代码为例( S i S_i Si 表示statement i, C i C_i Ci 表示condition i):

S1;
if (C1){
    S2;
    S3;
}
else
    S4;
S5;
S6;

CFG如下

在这里插入图片描述

在这个CFG中,可以看到 S1C1END 的2条路径都经过了 S5,S6,因此S5,S6 post-dominate C1。但是S2,S3,S4不post-dominate C1S1

对于路径C1->S2->S3 来说,S3 post-dominate S2 但是不post-dominate C1,所以 S3 依赖于 C1。依此类推,可以发现控制依赖源点是condition,终点是block中的语句。

所以CPG为

在这里插入图片描述

1.2.示例2

那么现在来一个嵌套循环的看看:

S1;
if (C1){
    S2;
    if (C2)
       S7;
}
else
    S4;
S5;
S6;

CFG:

在这里插入图片描述

首先看C1 -> S2 -> C2 中,C2 post-dominate S2,但是C1 -> S2 -> C2 -> S7 中,S7 既不post-dominate C2 也不 post-dominate S2,所以依赖的作用域只在1层条件中。

CPG:

在这里插入图片描述

1.3.示例3

S1;
while (C1){
    S2;
    S3;
}
S4;

CFG

在这里插入图片描述

重点看 C1S2 S3 的关系。C1->S2->S3S3不post-dominate C1 并且post-dominate S2,所以 S3 依赖于 C1。依此类推

CPG为

在这里插入图片描述

可以看到上面得到的CPG都是树状结构,父节点为条件,子结点为block中的语句。

求CPG

如何求CPG还没找到一个靠谱的资料,不过按照这篇博客。求CPG首先求前向支配树FDT。FDT由post-dominate关系构成,不过这里只保存直接post-dominate。比如示例1中,存在

S6 -> C1
S5 -> C1
S6 -> S5

那个 S6 -> C1 会被删除。那么示例1计算出来的FDT如下

在这里插入图片描述

然后就是进行抵消操作,把CFG中能抵消的边都抵消了。比如S1 -> C1C1 -> S1 互相抵消。不过这还剩一个问题,就是像 C1 -> S3 这种依赖是怎么产生的?或许计算CFG时就把这些加上(跟AST求并集?)?

二.数据依赖

定义:给定函数 f f f 的 CFG G = ( V , E ) G = (V, E) G=(V,E),以及2个结点 n i , n j n_i, n_j ni,nj(假定 j j j i i i 后面),并且 i ≠ j i \neq j i=j。CFG存在1个路径从 n i n_i ni n j n_j nj。如果 n i n_i ni 中计算得到的值在 n j n_j nj 中用到了,那么 n j n_j nj 数据依赖于 n i n_i ni

比如:

S1: a = b;
S2: b = c + d;
S3: e = a + d;
S4: b = 3;
S5: f = b * 2;

那么存在数据依赖边

S1 -> S3 (S1 def a, S3 use a)
S4 -> S5 (S4 def b, S5 use b)

虽然S2也def了b,但是并没有被使用。

上述数据依赖计算过程:

  • 只考虑了 = 赋值情况,没有考虑指针地址(scanf)或者函数调用引用赋值的情况。

  • 没有考虑指针变量别名的情况。

一般数据依赖分析之前都需要指针分析,以方便别名分析,不过这样开销太大。

  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
Houdini PDG(Procedural Dependency Graph)是一种用于处理大规模程序化任务的工具。它允许用户以图形化的方式构建和管理复杂的任务网络,并自动调度和执行这些任务。 PDG调度分为两种模式:进程内和进程外。进程内模式是指所有任务都在同一个Houdini会话中运行,而进程外模式是指任务可以在独立的进程中运行,以实现更高的性能和并行处理能力。 在PDG中,你可以使用自定义的节点来读取属性并控制工作项的生成。属性最常见的用法是在“TOP网络中”或“TOP引用的外部Houdini网络中”的节点参数中引用属性。例如,你可以使用Wedge节点创建一个名为pixelsamples的属性,其值为不同的渲染质量。然后,在ROP Mantra Render节点中,可以使用@pixelsamples字符串来引用先前的属性,并将其值设置到Pixel samples参数中。你还可以在调用TOP网络的外部资产/网络中引用工作项的属性,例如,在HDA Processor的参数中使用@attribute来引用从工作项中提取的值。 对于向量的分量引用,你可以使用@attribute.component来引用特定的分量,其中component是从0开始的数字,或者x、y、z(分别等于0、1、2)。例如,@pos.x或@pdg_output.0。另外,你还可以使用pdgattribvals将属性数组的所有组件引用为以空格分隔的字符串。 总之,Houdini PDG是一个强大的工具,可以帮助用户高效地处理大规模的程序化任务,并且支持属性引用和自定义节点来实现更灵活的工作流程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [翻译Houdini官方文档:PDG/TOPs介绍](https://blog.csdn.net/u013412391/article/details/115037479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值