写在前面的话

本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知识点的理解。也由于这是本人第一次开坑写博客,结构内容自有诸多不合理之处,希望有问题的地方大家可以指出。


系列文章目录

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)入门相关推荐

  1. 【软件分析/静态程序分析学习笔记】2.中间表示(Intermediate Representation)

    写在前面的话 本渣有幸成为南京大学软件学院研究生,在前往仙林校区蹭课的时候偶然发现了这门宝藏课程,听了以后感觉深有收获,但又因为课程难度较大,国庆假期归来发现遗忘较多,因此开了一坑来记录自己对每节课知 ...

  2. 怎么在C语言软件上验证程序,一种验证指针程序的方法

    随着国家.社会和日常生活对软件系统的依赖程度日益增长,安全攸关软件的高可信成为保障国家安全.保持经济可持续发展和维护社会稳定的必要条件. 形式验证是提高软件可信程度的重要方法.粗略地说,软件的形式验证 ...

  3. timequest静态时序分析学习笔记之工具使用

    第三章 工具使用 这里我通过几条约束命令来讲解timequest工具的简单使用. 3.1 creat_clock约束命令 相关代码: 图27 第一步,在quartus ii软件tools下来菜单中找到 ...

  4. GPS软件接收机matlab程序学习笔记(一)

    clear all;clc;cla;close all; format longg; %%15位有效数 %% 一. 设定GPS数据文件参数 %%%%%%%%%%%%%% gps_bd = 0; % 0 ...

  5. 布谷鸟沙盒分析静态文件_【虚拟机镜像分析】

    来源:iForensics ID:iForensics-2016 我们在工作中经常会接触到各种各样的虚拟机镜像,常见的镜像文件格式有:raw.qcow2.qed.qcow.luks.vdi.vmdk. ...

  6. Python 数据分析学习笔记(一):Pandas 入门

    文章目录 一.Pandas 概述 二.Series 对象 三.DataFrame 对象 四.导入外部数据 1. 导入 .xls 或 .xlsx 文件 2. 导入 .csv 文件 3. 导入 .txt ...

  7. 【Linux 内核】实时调度类 ⑤ ( 实时调度类 rt_sched_class 源码分析 | 结构体字段及函数指针分析 )

    文章目录 一.rt_sched_class 结构体变量类型 sched_class 二.next 字段值 三.enqueue_task 函数指针值 四.dequeue_task 函数指针值 五.yie ...

  8. 企业分析【鸟哥笔记】

    企业分析[鸟哥笔记] 前言 分析一下鸟哥笔记这家企业.看我能分析出什么信息来.此过程是实验过程.算是我企业分析的一个试错板块. 时长大约半小时. 分析思路:首先看官网,然后看企业政府公示,最后看第三方 ...

  9. 构建meteor应用程序_我如何在一个月内构建一个复杂的文本分析应用程序

    构建meteor应用程序 by Jeffrey Flynt 由Jeffrey Flynt 我如何在一个月内构建一个复杂的文本分析应用程序 (How I built a complex text ana ...

最新文章

  1. Hadoop完全分布式HA环境搭建
  2. python没有英文基础能学吗-初中毕业没有英语基础能学编程吗?该学C或者Python?...
  3. 谈谈考研复试的一些经验和建议
  4. ASP——Request.Form()方法获取POST提交方式的表单中文乱码解决方案
  5. SAP CRM WebClient UI注释引起的错误消息:Uncaught SyntaxError - unexpected end of input
  6. 三相四线怎样查漏电_老电工支招!漏电保护器的接线方法
  7. ProtoBuf3语法指南(Protocol Buffers)_上
  8. AngularJS 表格
  9. webpack4.0.1安装问题及解决方法
  10. 【图像增强】基于matlab暗通道图像去雾【含Matlab源码 101期】
  11. 自动检测删除微信好友:学会这些方法,别再花冤枉钱!
  12. 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
  13. 原生JavaScript实现查找汉字首字母
  14. 【期刊会议】机器学习深度学习 + 计算机视觉(To be continued..)
  15. 移动芯片巨头英国ARM的发展史
  16. 利用gitlab pages和hexo搭建一个个人博客
  17. HDU 5698:瞬间移动(排列组合)
  18. python实现火车票查询订票退票_使用Python和Splinter实现12306火车票查询与抢票
  19. 冶金物理化学复习 --- 湿法分离提纯过程
  20. 教你快速去除照片上的水印?操作简单,小白一学就会!

热门文章

  1. ODBC中用户DSN、系统DSN、文件DSN各代表的含义
  2. php 选择列表,php实现的美国50个州选择列表实例
  3. Unity3D 马赛克效果
  4. linux星际译王安装,Linux下星际译王 stardict 的安装
  5. 音频编解码G.711 G.729 G.723带宽问题
  6. javaScript替换函数
  7. 收集的比较好的儿童网站
  8. 等级保护2.0基础要求 具体测评方法
  9. 【SQL 筛选】基于SQLite
  10. 机械行业ERP快速准确完成成本核算流程