控制流分析之构建支配树

news2024/11/29 8:02:58

控制流分析之构建支配树

  • 引言
  • 1 分析有向图
  • 2 构建支配树
    • 2.1 求最小半支配点
    • 2.2 求最近支配点

引言

在这里插入图片描述
如上一个带有起始入口点的有向图为例,从A到Q的必经结点有A、L、M、Q,我们称其为Q的支配点,其中M为Q的最近支配点。我们将每个结点的最近支配结点指向自己,形成一颗如下图的树。该树就是图的支配树。
在这里插入图片描述
在编译器中,支配树作用显著。例如,它可以辅助我们识别函数中的循环等功能。本文将将讨论如何从一个图构建支配树?

1 分析有向图

首先,我们从图的起始入口点A执行深度优先搜索,并在搜索过程中依次对结点进行从小到大标记序号(即DFS序号,简称dfn)。最终,形成如下图:
在这里插入图片描述
注:图中红色链路,为DFS树的边。

对图中结点进行观察,发现如下一些特性:

  • 图中,偏左枝兄弟上的结点永远不可能指向偏右枝上的任意结点。如果可以,那么根据DFS搜索规则,最终形成的搜索树就会发生变化。
  • 图中,任意结点的必经结点必定在A到该节点的DFS搜索路径上。也就是说任意结点的必经结点的dfn必小于等于该节点的dfn。

2 构建支配树

构建支配树的算法,可以总结为如下几步:

  1. 首先,求出所有结点的最小半支配点;
  2. 然后,通过最小半支配点求出每个结点的最近支配点;
  3. 最后,依靠最近支配点串成支配树。

注1:点p的半支配点q满足: dfn[q] <= dfn[p] 且 存在一条q到p的路径上的任意结点(不包括q、p)的dfn都大于p的dfn。特别地,若q的dfn小于p的dfn,且q直接指向p,那么q也是p的半支配点;同时,结点自身也是自己的半支配点;
注2:点p的最小半支配点就是p的所有半支配点中dfn最小的结点。

2.1 求最小半支配点

我们以结点L为例,L共有五个前驱结点,按dfn分为两组:

  • 第一组是dfn小于L的结点,有两个:D和K;
  • 第二组是dfn大于L的结点,有三个:O、Z、Q;

求最小支配结点算法如下:

  1. 首先,对于第一组的两个结点,其dfn满足半支配点的定义,所以它们直接加入到L的半支配点列表中;
  2. 对于第二组的每个结点:采用递归思想求其半支配点。对于dfn小于或等于L的dfn的半支配点,将其加入到L的半支配点列表中;对于dfn大于L的dfn的半支配点,继续求这些半支配点的半支配点;以此类推。。。采用层层向上,直到求出的所有支配点的dfn小于或等于L的dfn(即11)并加入到L的半支配点列表后终止递归。
    最后,O往上求得半支配点是P、D;Z往上求得半支配点是B、D;Q往上求得半支配点是L自身。
  3. 最后在L的半支配点列表中,选dfn最小的结点作为L的最小半支配点(即B)。

注:实际算法实现中,可以将L的最小半支配点初始化为自身; 每次迭代L的前驱结点时,按照上述方法求得其半支配点后,与当前L的最小半支配点比较dfn大小,发现比其小,就将其更新。这样省略最后在所有半支配点中迭代dfn最小的半支配点。

2.2 求最近支配点

一般,最小半支配点极可能就是最近支配点。但是,也会有特殊情况,例如L的最小半支配点B到L的DFS路径上有一条A->P的路径对B旁支了;也就是说这时B,并不是L的支配点。

通过最小半支配点求最近支配点算法如下:

  1. 首先,将最小半支配点的dfn初始化为迭代终止值;

  2. 从L开始沿着DFS搜索路径反向往上遍历,每遍历一个结点:
    若迭代结点的dfn值等于迭代终止值,则终止迭代。
    反之,又若该结点的最小半支配点的dfn小于迭代终止值,则将该结点的最小半支配点的dfn更新为迭代终止值;

  3. 最后的迭代终止结点就是L的最近半支配点。

注:按照上述算法,最后求得L的最近支配点为A。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/142466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享124个PHP源码,总有一款适合您

PHP源码 分享124个PHP源码&#xff0c;总有一款适合您 源码下载 链接&#xff1a;https://pan.baidu.com/s/1AIktEQ0-cPRoSSAw_eA2Lw?pwdfb9m 提取码&#xff1a;fb9m 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0…

2022 Apache APISIX 年度记忆

时光已逝&#xff0c;转眼 2022 年已然落下了帷幕。Apache APISIX 社区在众多开源爱好者和开发者的陪伴下&#xff0c;又一起走过了新的四季。 在过去的一年中&#xff0c;我们的开源项目和社区都取得了许多成就&#xff0c;并得到了来自全球范围的广泛关注和支持。2022 年&am…

数据库管理与表文件管理

数据库管理&#xff1a; 1.MySql服务器管理数据库位置&#xff1a;C:\ProgramData\MySQL\MySQL Server 5.5\data 2.查看所有的数据库名 show databases; mysql> show databases;&#xff08;查看有哪些数据库 这属于MySql的命令&#xff0c;不属于SQL语句&…

硅基仿生业务全面 Serverless 容器化,14万+问答库助力糖尿病科普

作者&#xff1a;宁佑章&#xff08;硅基仿生科技&#xff09;、元毅&#xff08;阿里云容器服务&#xff09; “使用阿里云容器服务 Knative&#xff0c;解决了开发迭代慢的问题&#xff0c;加速了深度学习模型的性能提升&#xff1b;同时提供了弹性可伸缩的资源配置&#xf…

关于Linux宝塔面板nginx配置关于php项目的跨域请求

1、网上有好多跨域请求的案例。最多的如下&#xff1a; 在项目下的配置文件中添加&#xff1a; #add_header Access-Control-Allow-Origin * always; #add_header Access-Control-Allow-Credentials true; #add_header Access-Control-Allow-Methods GET,POST,OPTIONS…

新库上线 | CnOpenData中诚信绿金ESG评级数据

中诚信绿金ESG评级数据 一、数据简介 在碳达峰、碳中和的时代浪潮下&#xff0c;以环境、社会、公司治理为核心的ESG投资理念迅速成为发现资本市场投资机遇、规避投资风险的利器。中诚信绿金在多年信用评级经验的基础上通过建立契合国内政策趋势、信息披露现状、行业发展情况…

applicationContext讲解

applicationContext讲解 生成bean 豆子&#xff0c;bean工厂&#xff0c;对象的工厂 id是对象名&#xff0c;豆子的名字&#xff0c;全项目唯一&#xff0c;class是类全路径名 bean标签的底层实现是无参构造方法 <bean id"book1" class"com.nz.entity.Book&q…

【BFS 广度优先搜索】详解感染橘子最短时间问题

一、题目描述 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直…

nginx在linux上的部署

第一步、虚拟机安装新建虚拟机&#xff08;创建的时候记得打开网络连接&#xff0c;使用nat转换的方式&#xff09;linux配置上网第一种方式&#xff1a;自动获取&#xff0c;将ipv4设置为dhcp的自动获取。但是这样每次获取的ip可能不一样。使用xshell连接的时候可能需要修改。…

第四十一讲:神州防火墙透明模式的初始配置

现在要求把防火墙接入到现有的局域网中&#xff0c;尽量不改变已有的LAN架构和IP 地址分配&#xff0c;还能对内网的流量管理进行管理&#xff0c;起到对内网的安全保护作用。防火墙接入要求&#xff0c;应该选择防火墙的工作模式为透明模式。透明模式对原有网络的介入最少&…

把PBP、前端对接、钉钉集成玩透的考试系统

文/刘俊良 周亮 年佳斌 编辑/杜逸敏 一、项目背景 客户需要开发一套企业内部的考试系统&#xff0c;用于企业内部规章制度的学习及考核。系统的主要功能包括&#xff1a; 每个员工都可以进行每日答题与专项答题。根据答题结果&#xff0c;归类不同的题库以供员工查询学习。…

进击的 AI 生成,创造性的新世界!

2022年&#xff0c;AI艺术生成文本生成图像的AI绘画生成器如雨后春笋般涌现&#xff0c;以一幅幅“不明觉厉”的AI作品进入大众视野。从2月Disco Diffusion爆火&#xff0c;仅两个月后OpenAI发布DALL-E 2&#xff0c;谷歌和Meta紧随其后宣布了各自的AI”画家“Imagen和Make-A-S…

尚医通-排班规则接口-排班详情接口-前端整合(二十五)

目录&#xff1a; &#xff08;1&#xff09;医院排班-排班规则接口 &#xff08;2&#xff09;医院排班-排班规则-前端整合 &#xff08;3&#xff09;医院排班-排班详情接口 &#xff08;4&#xff09;医院排班-排班详情前端整合 &#xff08;1&#xff09;医院排班-排班…

一文分析Linux虚拟化KVM-Qemu分析之内存虚拟化

说明&#xff1a; KVM版本&#xff1a;5.9.1QEMU版本&#xff1a;5.0.0工具&#xff1a;Source Insight 3.5&#xff0c; Visio 1. 概述 深入分析Linux虚拟化KVM-Qemu之ARMv8虚拟化文中描述过内存虚拟化大体框架&#xff0c;再来回顾一下&#xff1a; 非虚拟化下的内存的访问…

剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树 一、题目 输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请构建该二叉树并返回其根节点。 假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 Input: preorder [3,9,20,15,7], inorder [9,3,15,20,7] Output: [3,9,20,null,null,1…

ansible第三天作业

1.挂载本地光盘到/mnt 2.配置yum源仓库文件通过多种方式实现 仓库1 &#xff1a; Name: RH294_Base Description&#xff1a; RH294 base software Base urt: file:///mnt/BaseOS 不需要验证钦件包 GPG 签名 启用此软件仓库 仓库 2: Name: RH294_Stream Description …

QGIS编译---QGIS3.22.4 + Qt5.15.3 + VS2019 ---64位版本

0 编译结果 先放上编译结果&#xff1a; 图1 QGIS3.22 启动界面 图2 QGIS3.22 操作界面 1 前言 因一些主观、客观原因&#xff0c;一年多没更新博客了&#xff0c;提笔继续。 这是笔者编译的第三个版本QGIS&#xff0c;本次编译原因有四&#xff1a; &#xff08;1&#xff…

05-微服务调用组件FeignDubbo实战

JAVA 项目中如何实现接口调用 1&#xff09;Httpclient HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 Http 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的UR…

Neo4j图数据库实现节点批量删除

1 前言 1-1 简介 由于对图数据库需要经常维护&#xff0c;图数据库建设初期&#xff0c;需要经常对数据写入删除等操作。 1-2 任务背景 再将1100万数据写入Neo4j后&#xff0c;由于需要对每个实体的label做精细化处理&#xff0c;之前写入的时候每个实体的label全部都为‘Comm…

Webhook端口使用介绍与演示

在API接口调用的集成项目中&#xff0c;用户调用知行之桥的API接口以给EDI系统推送数据时&#xff0c;经常会有这样的疑问&#xff1a;怎样查看是否调用接口成功&#xff1f;怎样查看数据是否推送成功&#xff1f;推送之后用户端会有怎样的响应提示&#xff1f; 为满足以上问题…