Point-to Analysis指针分析(2)

news2024/9/21 11:11:08

https://blog.csdn.net/qq_43391414/article/details/111046505

下面介绍一种新的指针分析的算法Steensgaard算法,并将其与上一篇文章介绍

Steensgaard算法
不同于Andersen算法,Steensgaard在前者的基础上,再次对问题进行了简化,从而指针分析的速度变快了,但是损失了精度。
那么其究竟是如何的一个过程呢?

约束
前面都和Andersen算法过程及其类似,但是约束变了。
这个是Andersen的约束条件(其实就是上一篇文章中的那个表)。

在这里插入图片描述

Steensgaard改成了:

在这里插入图片描述

可以看到,区别就在于将子集关系直接换成了等号,从而使得指针分析变得大大简化,从而直接在线性时间分析完毕。(注意:这里的线性时间o(n)中的n是指:指针语句的个数。)

流程

Steensgaard算法的流程十分简单,如下,一看就懂。
假设有如下指针语句:

 在这里插入图片描述

我们先看红色部分的指针语句,那么和Andersen算法一样,写出约束,然后初始化约束图(下面的约束图没有画出aryA,aryB节点,但是这不要紧)。

 在这里插入图片描述

继续分析下一句:

在这里插入图片描述

写出约束,并完善约束图。

在这里插入图片描述

解释:第5个语句的函数调用过程其实是:

 

p=t1,q=t2

 这个是函数的参数传递。所以根据上面两条我们可以写出约束(注意在Steensgaard中这个简单约束是等号):
在这里插入图片描述
然后将t1和p放在一起,形成一个集合,另外还要将pts(t1)和pts§放在一起,形成一个集合,但是由于此处p是首次定义,所以pts§为空集。
继续分析下一句:

 在这里插入图片描述
写出约束,完善约束图:

在这里插入图片描述
看过我第一篇文章的话,这很容易理解,照葫芦画瓢而已。
下句tmp2=*q和上面步骤一样。 

在这里插入图片描述
在这里插入图片描述
继续分析下下句 

在这里插入图片描述
写出约束,完善约束图。(注意下面是等号,以红色为准)。

在这里插入图片描述
约束图变成: 

在这里插入图片描述
解释:此处就完全体现了两次合并集合了,由于pts(PB)=pts(tmp1),所以PB和tmp1需要合并,最后成了 

在这里插入图片描述

上面是第一个合并,第二次合并是pts(PB)pts(tmp1)的合并,即:

在这里插入图片描述
分析最后一句,也是同样简单的。 

在这里插入图片描述
发现即相当于想要pts(PA)=pts(tmp2),即想要PA和tmp2合并,以及他们的子集合并,但是已经合并了,所以无需更改。 

在这里插入图片描述
至此就已经分析完毕了。 

比较

在这里插入图片描述
从两种方法的约束定义可以看出来,Andersen是子集概念,Steensgaard是相等概念,反应到算法中就是直接粗暴合并。所以效率更高,损失精度。

时间复杂度: 

 

  • Steensgaard很快,几乎是线性。虽然有的时候合并会浪费一点时间,如上面的第9条指针语句,但是大多都很快,比如前4条指针语句,最后一条指针语句甚至没有任何改变。所以大概o(n),其中n是指针语句的个数。
  • Andersen较慢,对于一条语句就可能是o(n^2)了,由于有n条指针语句,o(n^3)。

在这里插入图片描述
例子:
在这里插入图片描述
如果是Steensgaard怎么做呢?其不会指向d,e,f。而是将y与a,b,c和并,复杂度为1,而前者是9(3*3)。 

 

以上就是指针分析的两个常用算法了,注意以上都是属于流不敏感的算法哦。

(ps:提供Steensgaard的论文给感兴趣的人阅读:Points-to analysis in almost linear time,或者自己去找这篇文章也能找到)。

 

 

 

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

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

相关文章

远程访问及控制

目录 一、SSH远程管理 1)SSH的简介 2)SSH的优点 3)常用的SSH软件的介绍 4)SSH 的组成 5)SSH的密钥登录 密钥登录的过程: 二、SSH的运用 1 )SSH配置文件信息 2)存放ssh服务…

JAVA 进程CPU过高排查

1. top命令看一下JAVA进程: 占用500%多,非常恐怖,程序卡得动不了了。 2. 使用命令top -H -p PID 此处PID就是上一步获取的进程PID,我的PID是13342,通过此命令可以查看实际占用CPU最高的的线程的ID,此处几位…

ChatGPT+Ai绘图【stable-diffusion实战】

ai绘图 stable-diffusion生成【还有很大的提升空间】 提示词1 Picture a planet where every living thing is made of light. The landscapes are breathtakingly beautiful, with mountains and waterfalls made of swirling patterns of color. What kind of societies m…

【学习笔记】unity脚本学习(五)【常用的方法函数Destroy、Instantiate 、SendMessage、invoke 、Coroutine】

目录 常用的方法函数Object体系结构MonoBehaviour复习继承的变量 继承自Object的方法Destroy 物体的销毁DestroyImmediate 立即销毁对象(强烈建议您改用 Destroy)Object.DontDestroyOnLoadObject.Instantiate 物体的生成类子弹生成案例 继承自Component的…

八股+面经

文章目录 项目介绍1.不动产项目数据机器学习算法调研图像提取算法调研数据集-ImageNetXceptionVGGInceptionDensenetMobilenet 2.图书项目技术栈面试问题 Java基础MapHashMap v.s Hashtable(5点)ConcurrentHashMap v.s Hashtable(2点)代理模式1. 静态代理2. 动态代理2.1 JDK 动…

什么样的人适合学习网络安全?怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题:什么样的人适合学习网络安全?我适不适合学习网络安全? 会产生这样的疑惑并不奇怪,毕竟网络安全这个专业在2017年才调整为国家一级学科,…

elasticsearch——数据同步

目录 数据同步思路分析 方案一:同步调用 方案二:异步通知 方案三:监听binlog 区别 关于elasticsearch与数据库数据同步 导入课前资料提供的hotel-admin项目,启动并测试酒店数据的CRUD 声明exchange、queue、RoutingKey 导…

Python列表和字典前面为什么会加星号(**)?

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 python 中,单星号*和双星号**除了作为“乘”和“幂”的数值运算符外, 还在列表、元组、字典的操作中有着重要作用。 一、列表(list)、元组(tuple&#xff09…

flac格式如何转换为mp3,这3个方法超好用

随着音频格式的不断创新和发展,每种格式对应不同的特点。比如像flac格式可以提供无损音质的体验,但它的文件大小却是相对较大,不太适合在普通设备上进行传输和使用。而mp3作为一种流行的音频格式,它的压缩率较高,不但可…

OceanBase 4.1解读:我们想给用户一个开箱即用的OceanBase部署运维工具

欢迎访问 OceanBase 官网获取更多信息:https://www.oceanbase.com/ 关于作者 肖磊 OceanBase 产品专家 负责 OceanBase 运维管控体系产品规划与设计,包括安装部署工具(OBD、OAT)、运维管控平台(OCP、OCP Express),致力…

MySQL安装步骤详解

MySQL环境搭建 MySQL的下载 MySQL的4大版本 MySQL Community Server 社区版本,开源免费,自由下载,但不提供官方技术支持,适用于 大多数普通用户。 MySQL Enterprise Edition 企业版本,需付费,不能在线下载…

运行torch心得体会

遇到的问题: ①ModuleNotFoundError: No module named torch ②‘conda‘不是内部或外部命令,也不是可运行的程序或批处理文件。 ③import torch 提示找不到指定的模块visual C redistributable is not installed 过程: 用前一段时间就下…

流程图拖拽视觉编程--概述

一般的机器视觉平台采用纯代码的编程方式,如opencv、halcon,使用门槛高、难度大、定制性强、开发周期长,因此迫切需要一个低代码开发的视觉应用平台。AOI缺陷检测的对象往往缺陷种类多,将常用的图像处理算子封装成图形节点,如抓直…

「C/C++」C/C++强制类型转换

博客主页:何曾参静谧的博客 文章专栏:「C/C」C/C学习 目录 相关术语C语言中的强制类型转换C中的强制类型转换static_castdynamic_castreinterpret_castconst_cast 注意事项 相关术语 强制类型转换:是指将一个数据类型强制转换为另一个数据类型…

magic Grid

说明文档 A lightweight Javascript library for dynamic grid layoutshttps://vuejsexamples.com/a-lightweight-javascript-library-for-dynamic-grid-layouts/npm npm install magic-grid cnd <script src"https://unpkg.com/magic-grid/dist/magic-grid.cjs.js…

【C++ 七】类和对象:封装、继承、多态、友元、运算符重载

封装、继承、多态、对象的初始化和清理、C对象模型和this指针、友元、运算符重载 文章目录 封装、继承、多态、对象的初始化和清理、C对象模型和this指针、友元、运算符重载前言1 封装1.1 封装的意义1.1.1 封装意义一1.1.2 封装意义二 1.2 struct 和 class 区别1.3 成员属性设置…

数据结构——二叉树的修改与构造

数据结构——二叉树的修改与构造 一、修改二叉树226. 翻转二叉树1.前/后序递归2.广度优先搜索迭代3.拓展&#xff1a;修改中序遍历 / 中序统一迭代写法 114. 二叉树展开为链表 二、构造二叉树106. 从中序与后序遍历序列构造二叉树递归思路 105. 从前序与中序遍历序列构造二叉树…

Java day11

第11章 在用户界面上排列组件 11.1 基本的界面布局11.1.1 布置界面11.1.2 顺序布局11.1.3 方框布局11.1.4 网格布局11.1.5 边框布局 11.2 使用多个布局管理器11.3 卡片布局11.3.1 在应用程序中使用卡片布局11.3.2 单元格内边距和面板内边距 11.1 基本的界面布局 11.1.1 布置界…

瑞芯微rk3568移植openbmc(五)----关于novnc h265 webcodec硬解码

本章没有什么实质内容&#xff0c;其实在第四节调好了H264的webcodec以后&#xff0c;H265仅仅只需要改下参数&#xff0c;其他的都交给webgl去处理就行了&#xff0c;没有什么大的变化&#xff0c;vp8、vp9、h264、h265处理都一样&#xff0c;仅仅只是参数的变化&#xff0c;不…

Winform粉丝提问1——winform怎么在设计界面找到代码里的控件

前言&#xff1a; 今天订阅《Winform从入门到精通》的粉丝在VIP群里面问我一个问题&#xff0c;我感觉这个问题应该是初学者都会遇到的&#xff0c;所以我写了这篇文章来帮助初学者来理解这个问题&#xff0c;问题如下&#xff1a; 假设我在Form1界面上添加了两个Label&#x…