南京大学【软件分析】08 Pointer Analysis

文章目录

  • 1. Motivation
  • 2. Introduction to Pointer Analysis
  • 3. Key Factors of Pointer Analysis
    • 3.1 Heap Abstraction
    • 3.2 Context Sensitivity
    • 3.3 Flow sensitivity
    • 3.4 Analysis scope
  • 4. Concerned Statements

1. Motivation

指针分析存在不精确的问题。对于下面的例子,n的声明类型为Number,使用CHA分析,那么n.get()会返回三个目标函数,分别是Zero.get One.get Two.get,这就导致x的接收了0 1 2三个不同的值,x最终为非常量NAC。但实际上我们期望调用One.get,得到返回值1。
因此引入指针分析,使n指向new One,解决这种CHA引入了很多假的调用边的问题。
在这里插入图片描述

2. Introduction to Pointer Analysis

指针分析是基础的静态分析,明确了程序中的指针可以指向哪些内存的地址,计算一个指针(variable或filed)可以指向哪些对象。
指针分析是一个may- analysis,是过近似的over-approximation
在这里插入图片描述
指针分析Pointer analysis:程序中的指针会指向哪些对象?
别名分析Alias analysis:两个指针可以指向同一个对象吗?

3. Key Factors of Pointer Analysis

影响指针分析精度和效率的因素有一下四种,这四个因素分别回答了对应的问题。
这里主要介绍红色部分
在这里插入图片描述

3.1 Heap Abstraction

在动态执行中,由于循环结构的存在,堆对象的数量是无限的。因此,在静态分析时,堆抽象Heap Abstraction把具体的对象抽象成有穷的抽象对象(把同类对象合并 )。
在这里插入图片描述
堆抽象主要分两大流派:Store based model和Storeless model,这里主要介绍Store based model中的Allocation sites在这里插入图片描述
Allocation sites创建点:是堆抽象中最常用的技术。它指的是把在同一个创建点创建的对象都归为一类。即程序中有几个new语句,就有几个对象,这种方法抽象出来的对象肯定是有限的,因为程序是有限的。下面对象的下标表示代码行数
在这里插入图片描述

3.2 Context Sensitivity

上下文敏感:更精确。每一个函数在被调用的时候,考虑被调用时的上下文。为每一个调用点都创建一个上下文
上下文不敏感:不同的调用点使用同一个上下文,每一个函数只分析一次
下面的例子,左侧为上下文敏感的结果,右侧为上下文不敏感的结果
在这里插入图片描述

3.3 Flow sensitivity

流敏感Flow sensitivity:更精确,开销大。考虑语句的执行允许
流不敏感Flow insensitivity:忽略控制流的顺序,把程序当作一堆语句的无序集合。下面的例子中流不敏感存在误报
下面的例子,左侧为流敏感的结果,右侧为流不敏感的结果
在这里插入图片描述

3.4 Analysis scope

Analysis scope:明确了在做指针分析时,应分析程序中的哪些部分。
Whole-program:分析程序中所有指针的指向关系,分析一次可以获得所有的指向关系
Demand-driven:根据特定需求,只分析需求的指针分析,适用于有特定需求的指针分析
下面的例子,左侧为Whole-program的结果,右侧为Demand-driven(只考虑第五行)的结果
在这里插入图片描述

4. Concerned Statements

指针分析只关注影响指针的语句pointer-affecting statements
java当中的指针:

  • Local variable: x
  • Static field: C.f。很多文献称其为global variable,类似于Local variable的处理
  • Instance field: x.f。把它建模成一个对象(pointed by x)携带一个域 f
  • Array element: array[i]。静态分析忽略下标,把数组建模成只有一个filed的对象,并把这个filed称为arr,此时它的处理类似于Instance field。

在这里插入图片描述

指针分析中关心的五种语句pointer-affecting statements:(对于复杂的a.b.c.d引入临时变量分解成三地址码)

其中前四种较为简单,不涉及方法调用。
第四种涉及到方法调用,这里关注最复杂的Virtual call
在这里插入图片描述

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

快排三种递归及其优化,非递归和三路划分

个人主页:Lei宝啊 愿所有美好如期而遇 目录 快排简介: 快排的三种递归实现: Hoare: 挖坑: 双指针: 小区间优化: 三数取中优化: 快排非递归实现: 快排的三路划…

Ubuntu配置深度学习环境(TensorFlow和pyTorch)

文章目录 一、CUDA安装1.1 安装显卡驱动1.2 CUDA安装1.3 安装cuDNN 二、Anaconda安装三、安装TensorFlow和pyTorch3.1 安装pyTorch3.2 安装TensorFlow2 四、安装pyCharm4.1 pyCharm的安装4.2 关联anaconda的Python解释器 五、VScode配置anaconda的Python虚拟环境 前言&#xff…

一维数组和二维数组的使用(char类型)

目录 导读1. 字符数组1.1 字符数组的创建1.2 字符数组的初始化1.3 不同初始化在内存中的不同1.3.1 strlen测试1.3.2 sizeof测试1.3.3 差异原因 1.4 字符数组的使用 2. 数组越界3. 数组作为函数参数博主有话说 导读 我们在前面讲到了 int 类型的数组的创建和使用: 一…

焕新古文化传承之路,AI为古彝文识别赋能

目录 1 古彝文与古典保护 2 古文识别的挑战 2.1 西文与汉文OCR 2.2 古彝文识别难点 3 合合信息:古彝文保护新思路 3.1 图像矫正 3.2 图像增强 3.3 语义理解 3.4 工程技巧 4 总结 1 古彝文与古典保护 彝文指的是云南、贵州、四川等地的彝族人使用的文字&am…

行为型设计模式——责任链模式

摘要 责任链模式(Chain of responsibility pattern): 通过责任链模式, 你可以为某个请求创建一个对象链. 每个对象依序检查此请求并对其进行处理或者将它传给链中的下一个对象。 一、责任链模式意图 职责链模式(Chain Of Responsibility) 是一种行为设…

MAC手动修复『已损坏』问题 终端运行命令报错处理

安装一些第三方软件会出现已损坏的报错提醒,需要用命令sudo xattr -rd com.apple.quarantine进行修复,但是终端提示命令错误,怎么版 错误有几种: No module named ‘pkg_resources’ 这是mac电脑上python2,python3并…

mfc140u.dll是什么文件?mfc140u放在哪个文件夹?详细修复教程

今天我想和大家分享一个非常常见的问题——mfc140u.dll丢失的困扰以及解决方法。 首先,让我们来了解一下什么是mfc140u.dll。这是一个非常重要的动态链接库文件,它是Microsoft Foundation Class Library的一个组件。许多软件和游戏都需要这个文件的支持才…

Appium 全新 2.0 全新跨平台生态,版本特性抢鲜体验!

关于Appium V2 Appium V2 beta版本在2021年发布,从2022年1月1号开始,Appium核心团队不会再维护Appium 1.x版本了,所有近期官方发布的平台驱动(如Android平台的UIAutomator,IOS平台的XCUITest)不再兼容Appi…

Qt多线程实现方式-moveToThread及其注意事项

Qt多线程实现方式-moveToThread及其注意事项 Chapter1 Qt多线程实现方式-moveToThread一、Qt下使用线程主要有两种方法。二、Qt下创建多线程也有两种方法。三、其它问题。 Chapter2 QT多线程接收串口数据1.前言2.功能作用3.软件测试效果4.基本步骤 Chapter3 利用Qt多线程机制实…

面试打底稿⑦ 项目一的第三部分

简历原文 抽查部分 完成路线规划模块选择路线功能,用neo4j这种存储图关系的非关系数据库,实现最短线路规划、最低成本线路规划 设计优化物流信息模块,合理选择数据库、缓存技术,实现数据精简、流量削峰、提高系统可 用性 模拟问答…

Scala第十五章节

Scala第十五章节 1. 递归 2. 案例一: 求阶乘 3. 案例二: 斐波那契数列 4. 案例三: 打印目录文件 scala总目录 文档资料下载

04、EL和JSTL核心技术

目录 1 EL表达式(熟悉) 1.1 基本概念 1.2 主要功能 1.3 访问内置对象的数据 1.3.1访问方式 1.3.2 执行流程 1.4 访问请求参数的数据 1.5 访问Bean对象的属性 1.5.1 访问方式 1.5.2 主要区别 1.6 访问集合中的数据 1.7 常用的内置对象 …

uboot启动流程-涉及lowlevel_init汇编函数

一. uboot启动流程涉及函数 之前文章简单分析了 uboot启动流程的开始,从链接脚本文件 u-boot.lds 中,我们已经知道了入口点是 arch/arm/lib/vectors.S 文件中的 _start函数。 _start函数:调用了 reset 函数,reset 函数内部&…

1、Kafka 安装与简单使用

第 1 章 Kafka 概述 1.1 定义 Kafka传统定义: Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka最新定义 : Kafka是 一个开源的 分 布式事件流平台 &#xff08…

《CTFshow-Web入门》10. Web 91~110

Web 入门 索引web91题解总结 web92题解总结 web93题解 web94题解 web95题解 web96题解 web97题解 web98题解 web99题解总结 web100题解 web101题解 web102题解 web103题解 web104题解 web105题解总结 web106题解 web107题解 web108题解 web109题解 web110题解 ctf - web入门 索…

Scala第十四章节

Scala第十四章节 1. 隐式转换和隐式参数介绍 2. 隐式转换 3. 隐式参数 4. 案例: 获取列表元素平均值 scala总目录 文档资料下载

大数据Flink(九十):Lookup Join(维表 Join)

文章目录 Lookup Join(维表 Join) Lookup Join(维表 Join) Lookup Join 定义(支持 Batch\Streaming):Lookup Join 其实就是维表 Join,比如拿离线数仓来说,常常会有用户画像,设备画像等数据,而对应到实时数仓场景中,这种实时获取外部缓存的 Join 就叫做维表 Join。…

10.1 今日任务:select实现服务器并发

#include <myhead.h>#define ERR_MSG(msg) do{\fprintf(stderr, "__%d__:", __LINE__); \perror(msg);\ }while(0)#define PORT 8888 //端口号&#xff0c;范围1024~49151 #define IP "192.168.112.115" //本机IP&#xff0c;ifco…

Qt自定义菜单

Qt开发过程中&#xff0c;弹出菜单时我们一般使用QMenu,但是QMenu都是一条项固定的格式&#xff0c;如查想要自己的设计界面就没法使用默认的Action项了&#xff0c;因此我们得用自定义的QMenu。 本篇介绍使用自定义的QMenu设计出UI。我们使用QWidget QWidgetAction来实现。Q…

Spring注册Bean系列--方法1:@Component

原文网址&#xff1a;Spring注册Bean系列--方法1&#xff1a;Component_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Spring注册Bean的方法&#xff1a;Component。 注册Bean的方法我写了一个系列&#xff0c;见&#xff1a;Spring注册Bean(提供Bean)系列--方法大全_IT利刃出鞘…