【静态分析】静态分析笔记07 - 指针分析基础

参考:

【课程笔记】南大软件分析课程7——指针分析基础(课时9/10) - 简书

--------------------------------------------------------------

1. 指针分析规则

规则:采用推导形式,横线上面是条件,横线下面是结论。

  • New:创建对象,将new T()对应的对象oi加入到x指向的指针集。
  • Assign:将y指向的指针集加入到x指向的指针集。
  • Store:将y指向的指针集加入到oi.f指向的指针集
  • Load:Store的反操作。

2. 如何实现指针分析

算法要求:全程序指针分析,容易理解和实现。

本质:在指针(变量/域)之间传递指向信息。Andersen-style分析(很普遍)——很多solving system把指针分析看作是一种包含关系,eg,x = y,x包含y。

问题:当一个指针的指向集发生变化,必须更新与它相关的其他指针。如何表示这种传递关系?PFG。

PFG:用指针流图PFG来表示指针之间的关系,PFG是有向图

  • Nodes:Pointer = V U (O x F) 节点n表示一个指针。
  • Edges:Pointer X Pointer 边x -> y 表示指针x指向的对象may会流入指针y。

示例

PTA步骤

  1. 构造PFG(根据以上示例,PFG也受指向关系影响)
  2. 根据PFG传播指向信息

3. 指针分析算法

(1)过程内PTA算法

符号

  • S:程序语句的集合。

  • WL:Work list,待合并的指针信息,二元组的集合,<指针n,指向的对象集合pts>。pts将被加入到n的指向集pt(n)中。

  • PFG:指针流图。

问题

  1. 为什么要去重?答:避免冗余,英文叫做Differential propagation差异传播。

  2. 指针集用什么数据结构存储?混合集 Hibra-set,集合元素小于16个用hash set,大于16个用big-rector 位存储。

  3. 开源项目有哪些?Soot、WALA、Chord。

(2)示例

1 b = new C(); 
2 a = b;
3 c = new C(); 
4 c.f = a;
5 d = c;
6 c.f = d; 
7 e = d.f;

4. 指针分析如何处理函数调用

构造调用图技术对比

  • CHA:基于声明类型,不精确,引入错误的调用边和指针关系。
  • 指针分析:基于a指向的类型,更精确,构造更准的CG并对指针分析有正反馈(过程间指针分析和CG构造同时进行)。

(1)调用语句规则

call语句规则:主要分为4步。

  1. 找目标函数m:Dispatch(oi, k)——找出oi类型对象中的k函数,若没找到,则从父类找。
  2. receiver object:把x指向的对象oi传到m函数的this变量。
  3. 传参数:pt(aj), 1<=j<=n 传给m函数,即pt(mpj), 1<=j<=n。并建立PFG边,a1->mp1,...,an->mpn。
  4. 传返回值:pt(mret)传给pt(r)。并建立PFG边,r<-mret。

问题:为什么PFG中不添加oi->mthis边?

因为mthis只和oi的类型对象相关,而可能有pt(x)={new A, new B, new C},使得pt(x)中的所有对象都流向了mthis。

(2)过程间PTA算法

问题:由于指针分析和CG构造互相影响,所以每次迭代只分析可达的函数和语句。然后不断发现和分析新的可达函数。

可达示例

算法:黄色背景的代码是和过程内分析不同的地方。

符号

  • mentry:入口函数

  • Sm:函数m中的语句

  • S:可达语句的集合(就是RM中的语句的集合)

  • RM:可达函数的集合

  • CG:调用图的边

  • l:调用语句

  • m:目标函数

问题:为什么ProcessCall(x, oi)中,要判断L->m这条边是否已经加入到CG?

因为x可能指向多个对象,就会多次处理ProcessCall(x, oi),可能x中别的对象oj也指向这个目标函数m,已经将这条边加入进去了。

(3)示例

1 class A {
2   static void main(){
3       A a = new A();
4       A b = new B();
5       A c = b.foo(a);
6   }
7   A foo(Ax){...}
8 }
9 class B extends A {  
10  A foo(A y) {
11      A r=newA();
12      return r;
13      }
14  }

如果是CHA的话,CG={5->B.foo(A), 5->A.foo(A)},错误识别调用边。

结果

 问题:没有入口函数的?

如对库函数处理,生成调用库函数的程序。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【VTKExamples::Meshes】第十八期 OBBDicer

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 公众号:VTK忠粉 前言 本文分享VTK样例OBBDicer,并解析接口vtkOBBDicer,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. …

GaussDB轻量化运维管理工具介绍

前言 本期课程将从管理平台的架构出发&#xff0c;结合平台的实例管理、实例升级、容灾管理和监控告警的功能和操作介绍&#xff0c;全面覆盖日常运维操作&#xff0c;带您理解并熟练运用GaussDB运维平台完成运维工作。 一、GaussDB 运维管理平台简介 开放生态层 友好Web界面…

解决office2016专业增强版 “你的许可证并非正版,你可能是盗版软件的受害者“

问题描述&#xff1a;安装完office后,用kms已经激活成功&#xff0c;但是一直在上面显示“你的许可证不是正版&#xff0c;并且你可能是盗版软件的受害者&#xff0c;使用正版Office,避免干扰并保护你的文件安全。” 尝试过网上的各种方法都没用&#xff0c;后面发现是用的HEU …

分享:9.3版本无缝导入AVEVA PDMS高版本工程12.0,12.1,E3D

9.3版本可以无缝导入AVEVA PDMS的工程。 UKP3d导入AVEVA PDMS工程的方法 http://47.94.91.234/forum.php?modviewthread&tid163583&fromuid6 (出处: 优易软件-工厂设计软件专家) &#xff08;从AVEVA PDMS导出时元件和等级的功能我们正做收尾工作&#xff0c;到时可以…

Kafka---总结篇

kafka架构 主要概念 broker: 存储消息的机器 控制器controller &#xff08;1&#xff09;使用zookeeper&#xff0c; 除了提供一般的broker功能之外&#xff0c;还负责选举分区首领。通过在zookeepr中创建一个名为 /controller的临时节点称为 controller。每个选出的contro…

百科词条创建要多久成功?

在互联网信息爆炸的时代&#xff0c;百科词条作为权威的知识分享平台&#xff0c;其重要性不言而喻。那么&#xff0c;创建一个百科词条需要多久才能成功呢&#xff1f;创建百科词条是一个相当需要有耐心的工作&#xff0c;接下来伯乐网络传媒就来给大家讲一讲。 一、影响百科词…

node-sass报错如何解决

npm install 安装的时候 报node-sass错误 这个一看就是node版本兼容性导致的问题 node-sass与node版本不匹配 下面是常见的node版本和对应的node-sass版本 解决办法 1.单独安装node-sass npm install node-sass9.0.0 还是报上面的错误&#xff01;&#xff01;&#xff01;&a…

论文笔记:Leveraging Language Foundation Models for Human Mobility Forecasting

SIGSPATIAL 2022 1intro 语言模型POI客流量预测 2 方法 3 实验

Midjourney如何利用quality控制图片质量,让细节更丰富

hello 小伙伴们&#xff0c;我是你们的老朋友——树下&#xff0c;今天分享Midjourney提示词常用参数——quality&#xff0c;通过更给quality的值可以生成质量更好的图片&#xff0c;让细节更丰富&#xff0c;那么这个参数是怎么用的呢&#xff1f;话不多说&#xff0c;直接开…

2014NOIP普及组真题 3. 螺旋矩阵

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1967 背景知识&#xff1a; 螺旋矩阵可以采用模拟的方式生成。就是顺时针四个方向 第1步、是第 1 行&#xff0c;方向为从左到右&#xff0c;数值1。当向右遇到 边界n 或者 格子已填过数…

基于卷积神经网络的手写数字识别

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

海外短剧:跨文化的新浪潮与看剧系统的搭建,海外短剧系统搭建开发定制

在全球化的大潮下&#xff0c;海外短剧作为一种新兴的文化交流方式&#xff0c;正逐渐受到越来越多人的喜爱。这种融合了各地文化元素、叙事手法新颖独特的短剧形式&#xff0c;不仅丰富了观众的视觉体验&#xff0c;也为影视媒体和想拓展海外市场的企业带来了无限商机。 一、…

MMSeg分析Flops和Params

Flops计算量&#xff0c;params参数量 在文件中 tools/analysis_tools/get_flops.py利用以下命令实现 python tools/analysis_tools/get_flops.py configs/xxx/xxx-Net.py后面可跟参数shape控制输入图片尺寸&#xff0c;例如 python tools/analysis_tools/get_flops.py conf…

Python Django框架的内容管理系统库之wagtail使用详解

概要 Python Wagtail库是一个基于Django框架的内容管理系统(CMS),它提供了丰富的功能和工具,帮助开发者快速构建灵活、强大的网站和应用。本文将介绍如何安装和使用Python Wagtail库,以及它的特性、基本功能、高级功能、实际应用场景和总结部分。 安装 首先,需要安装Py…

uni-app HBuilderX通过easycom省略import自动导入自定义组件

快速尝试 自HBuilderX 2.5.5起支持easycom组件模式。更新HBuilderX即可尝试。 easycom默认已启用&#xff0c;并对项目下的components和uni_modules目录开启自动扫描&#xff0c;对符合下面路径和命名规则的组件自动导入。 components/组件名/组件名.vue uni_modules/组件名/…

Go并发安全,锁和原子操作

一. 并发安全 有时候在Go代码中可能存在多个goroutine同时操作一个资源(临界区)&#xff0c;这种情况会发生竞态问题(数据竞态)。 1.1 互斥锁 互斥锁是一种常见的控制共享资源访问的方法&#xff0c;它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mut…

【日志】CSDN-AI助手升级日志

CSDN-AI助手升级日志 2023/04/05上线 支持点赞、收藏回访 关注回访&#xff08;对方至少有一条博客的记录&#xff09; 评论回访 私信检测到群发消息自动三连 OR 通过私信指令三连触发 bug优化 优化检测模式&#xff0c;防止出现多触发情况 为了防止操作额度不够&#xff0c…

Spring日志

Spring日志的作用: 1.定位和发现问题 2.系统监控 3.数据采集 4.日志审计 打印日志步骤: 1.定义日志对象2.打印日志 RestController public class LoggerController {private static Logger logger LoggerFactory.getLogger(LoggerController.class);PostConstructpublic v…

Dos慢速攻击

这里写自定义目录标题 Dos慢速攻击 Dos慢速攻击 测试结果为“Exit status&#xff1a; No open connections left"&#xff0c;代表无此漏洞。 如果测试结束后connected数量较多&#xff0c;closed数量很少或0&#xff0c;说明之前建立的慢速攻击测试连接没有关闭&#…

最佳三款员工电脑行为监控软件评选

企业对员工生产力和数据安全的关注不断增加&#xff0c;员工电脑行为监控软件成为了许多企业不可或缺的工具。 这些软件不仅可以帮助企业管理者实时监测员工的电脑使用情况&#xff0c;还可以防止数据泄露和滥用公司资源。 然而&#xff0c;市面上有数不胜数的员工电脑行为监控…