【软件分析/静态程序分析学习笔记】7.指针分析(Pointer Analysis)入门
写在前面的话
本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知识点的理解。也由于这是本人第一次开坑写博客,结构内容自有诸多不合理之处,希望有问题的地方大家可以指出。
系列文章目录
1.静态程序分析(Static Program Analysis)介绍
2.中间表示(Intermediate Representation)
3.数据流分析(Data Flow Analysis) (上):可达性分析(Reaching Definitions)
4.数据流分析Data Flow Analysis) (下):存活变量分析(Live Variables Analysis)及可用表达式分析(Available Expressions Analysis)
5.数据流分析基础(Data Flow Analysis-Foundations)
6.过程间分析(Interprocedural Analysis)
7.指针分析(Pointer Analysis)入门
8.指针分析基础知识(Pointer Analysis Foundations)
一、动机
在上一篇文章中,我们讲到了一种过程间分析的算法CHA,这是一种牺牲了精度来换取效率的算法,可以根据对象的类型进行分析,得到这个对象调用的方法可能是在哪定义的。然而这种算法对精度的牺牲自然会导致一些我们不想看到的"严谨",就像上图所示,采用CHA算法会从对象n对应的类Number中寻找get()的定义,找不到后会从Number的子类寻找,因此经过CHA的分析n.get()的返回值是NAC。然而显而易见,由于n是One类型创建的,所以返回值应该是1才对,这就需要用到指针分析了。
二、指针分析
2.1 什么是指针分析
我们首先介绍一下指针分析的三个特征:
- 一个基本的静态分析:计算一个指针能指向哪个内存位置。
- 对于OO语言(主要是Java)来说:计算一个一个指针(variable或field)指向哪个对象。
- 作为一个may分析:计算指针指向的过拟合的对象集,即一个指针可能指向哪些对象?、
以上三个特征便可以看出指针分析到底是一种什么样的分析算法,其中需要解释一下的是第二条特征。不同于cpp,Java并没有真正的指针,或者说Java的指针被封装在代码底层,我们接触不到,而此处的指针指的是那些存储非数据而是地址的变量,例如T x = new T()
中的x
存储了新创建的一个类型为T的对象的地址,是一个指针。
2.2 一个指针会指向哪里
接下来用一个例子来具体感受一个指针会指向哪里:
右侧表格是左侧程序每个变量指针指向的对象,接下来一个个看。
第一、二行定义了a和x,分别指向A和B没问题;
第三行调用了A类中的set()函数,this指向当前对象,同时也是调用了这个方法的a指向的new A,而b指向自己新创建的new B;
而y指向了a.getB()返回的this.b所指向的new B;
下方的A.b即this.b,指向传入参数x的new B。
2.3 Pointer Analysis 和 Alias Analysis
Pointer Analysis是指针分析;
Alias Analysis是别名分析;
这是两个密切相关但是不同方面的分析,主要体现在:
指针分析主要分析指针指向哪个对象,而别名分析主要分析两个指针是否指向同一个对象。
这个点了解一下区别就可,不细说了。
2.4 指针分析的应用
指针分析有很多的应用场景,例如可用于
- 优化代码
- 查bug
- 安全性分析
- 验证测试
等技术场景。
三、指针分析中的关键因素
指针分析是一个复杂的系统,有不同的因素影响了这个系统的效率和精度,我们需要在此之间找到一个平衡,下图就是其中最重要的四个因素
四个因素分别是:堆抽象、上下文敏感、流敏感、分析范围,第三列则是一些最为广泛使用的选择策略。
3.1 堆抽象
Java运行时会将创建的很多的对象放在堆里以供调用,堆抽象就是对其建模。
为了确保终止性,堆抽象会将动态执行时无限的域映射到静态分析时有限的域,再进行静态分析:
堆抽象有很多种方法,最常用到的就是Allocation sites的抽象技术,这是一种Store based model,基于内存中地址的模型。
我将Allocation site翻译为抽象点,每个抽象点对应一个抽象对象,这个抽象对象代表被分配的所有具体对象,而系统通过抽象点对具体对象建模。
下面举个例子说明这种抽象关系:
动态运行时在for语句中创建了多个具体的对象a,而通过Allocation sites的技术抽象为一个抽象对象。
3.2 上下文敏感
上下文的敏感指的是系统模拟如何调用上下文,例如记录一个方法的传参、返回地址等,其中的上下文指的是被调方法的上下文。
左侧是上下文敏感的做法,对于每次调用方法的时候都会分别记录那次方法的上下文信息,而右侧是不敏感的做法,会将不同的调用合并,每个方法不论调用多少次都只会分析一次。
3.3 流敏感
流敏感指的是如何对控制流进行建模,我们之前学习到的算法都是流敏感的:
左侧是流敏感的分析,严格按照控制流的顺序进行分析,会在每个程序点都列出当前所有的指针指向;
右侧是流不敏感的分析,不考虑控制流的顺序,会将所有可能的指向一起加入域中。
由于流敏感分析的时候很多情况下域中的指向对象不可替换,因此开销很大,流不敏感的分析此时便可派上用处。
3.4 分析范围
分析分为整体分析和按需求分析。其中整体分析就是分析整个程序,不需要解释;按需求分析就是分析需要的代码行及相关的代码
1 x = new A();
2 y = x;
3 …
4 z = new T();
5 z.bar();
例如我要分析第五行的指针指向何处,只需要分析第四行即可。
3.5 总结
总结一下:
- 堆抽象:针对对象,选择Allocation-site抽象技术;
- 上下文敏感:针对方法,后续两种都会用到;
- 流敏感:针对控制流,为了减小开销,使用流不敏感的;
- 分析范围:由于并不知道得到需要分析处的指针指向需要从哪开始分析,有可能从头分析,消耗资源也很大,因此选择整体分析。
四、相关的语句
由于
- if-else
- switch-case
- for/while/do-while
- break/continue
四种语句并不会改变指针的指向,所以不考虑这四种语句的影响,主要分析以下四种类型的对象
- Local variable: x
- Static field: C.f
- Instance field: x.f
- Array element: array[i]
第一个局部变量x
不用赘述;
第二个静态域C.f
某些时候也可看作全局变量,一般不会碰到;
第三个实例域x.f
建模为 一个由x指向的对象 + 一个域f;
第四个数组元素在处理的时候会将其下标忽略,统一指向一个域,将array[i]
全部抽象映射到array.arr
的域中。
然后是五种会改变指针指向的操作:
这四种操作的需要牢记,将会在下一篇文章中具体分析。
五、总结
本文大概写了一下指针分析是什么,有哪些关注点,可以粗浅地了解一下什么是指针分析,具体的分析将在下一篇文章中进行。
【软件分析/静态程序分析学习笔记】7.指针分析(Pointer Analysis)入门相关推荐
- 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)
写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...
- 怎么在C语言软件上验证程序,一种验证指针程序的方法
随着国家.社会和日常生活对软件系统的依赖程度日益增长,安全攸关软件的高可信成为保障国家安全.保持经济可持续发展和维护社会稳定的必要条件. 形式验证是提高软件可信程度的重要方法.粗略地说,软件的形式验证 ...
- timequest静态时序分析学习笔记之工具使用
第三章 工具使用 这里我通过几条约束命令来讲解timequest工具的简单使用. 3.1 creat_clock约束命令 相关代码: 图27 第一步,在quartus ii软件tools下来菜单中找到 ...
- GPS软件接收机matlab程序学习笔记(一)
clear all;clc;cla;close all; format longg; %%15位有效数 %% 一. 设定GPS数据文件参数 %%%%%%%%%%%%%% gps_bd = 0; % 0 ...
- 布谷鸟沙盒分析静态文件_【虚拟机镜像分析】
来源:iForensics ID:iForensics-2016 我们在工作中经常会接触到各种各样的虚拟机镜像,常见的镜像文件格式有:raw.qcow2.qed.qcow.luks.vdi.vmdk. ...
- Python 数据分析学习笔记(一):Pandas 入门
文章目录 一.Pandas 概述 二.Series 对象 三.DataFrame 对象 四.导入外部数据 1. 导入 .xls 或 .xlsx 文件 2. 导入 .csv 文件 3. 导入 .txt ...
- 【Linux 内核】实时调度类 ⑤ ( 实时调度类 rt_sched_class 源码分析 | 结构体字段及函数指针分析 )
文章目录 一.rt_sched_class 结构体变量类型 sched_class 二.next 字段值 三.enqueue_task 函数指针值 四.dequeue_task 函数指针值 五.yie ...
- 企业分析【鸟哥笔记】
企业分析[鸟哥笔记] 前言 分析一下鸟哥笔记这家企业.看我能分析出什么信息来.此过程是实验过程.算是我企业分析的一个试错板块. 时长大约半小时. 分析思路:首先看官网,然后看企业政府公示,最后看第三方 ...
- 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序
构建meteor应用程序 by Jeffrey Flynt 由Jeffrey Flynt 我如何在一个月内构建一个复杂的文本分析应用程序 (How I built a complex text ana ...
最新文章
- Hadoop完全分布式HA环境搭建
- python没有英文基础能学吗-初中毕业没有英语基础能学编程吗?该学C或者Python?...
- 谈谈考研复试的一些经验和建议
- ASP——Request.Form()方法获取POST提交方式的表单中文乱码解决方案
- SAP CRM WebClient UI注释引起的错误消息:Uncaught SyntaxError - unexpected end of input
- 三相四线怎样查漏电_老电工支招!漏电保护器的接线方法
- ProtoBuf3语法指南(Protocol Buffers)_上
- AngularJS 表格
- webpack4.0.1安装问题及解决方法
- 【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】
- 自动检测删除微信好友:学会这些方法,别再花冤枉钱!
- 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
- 原生JavaScript实现查找汉字首字母
- 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
- 移动芯片巨头英国ARM的发展史
- 利用gitlab pages和hexo搭建一个个人博客
- HDU 5698:瞬间移动(排列组合)
- python实现火车票查询订票退票_使用Python和Splinter实现12306火车票查询与抢票
- 冶金物理化学复习 --- 湿法分离提纯过程
- 教你快速去除照片上的水印?操作简单,小白一学就会!