南京大学 静态软件分析(static program analyzes)-- Pointer Analysis 学习笔记
一、Motivation
我们对比基于CHA的分析方法和指针分析的分析方法。首先,回想一下CHA的构造过程。在这个程序中对get()的调用,在CHA分析下,应该调用哪几个方法?
使用CHA分析
可以看出,由于CHA只关心类的层次结构,分析结果的三个箭头中有两个是false positive。也因此导致了分析结果的不精确。 实际上n指向One(),只会调用One.Number()。
使用指针分析
利用指针分析,我们能知道n指向的对象就是new One()语句所新建出来的对象。所以能精确地知道x一定会取1。
比较两种分析,可以看出
- CHA速度快而精度低
- 指针分析速度稍慢而精度高
二、Introduction to Pointer Analysis
指针分析的概念
- A fundamental static analysis
- Computes which memory locations a pointer can point to
- For object-oriented programs (focus on Java)
- Computes which objects a pointer (variable or field) can point to
- Regarded as a may-analysis
- Computes an over-approximation of the set of objects that a pointer
- can point to, i.e., we ask “a pointer may point to which objects?”
总结来说:
- 指针分析的目标:分析程序指针可以指向哪些内存。对于Java等面向对象语言,主要分析指针指向哪个对象。
- 特点:属于may analysis,分析的结果是某指针所有可能指向哪些对象,与CHA相同,也属于过估计(只不过更精确)。
举一个具体的例子:
指针分析和别名分析的区别
指针分析和别名分析,它们虽然关系紧密,但存在区别:
- 指针分析:分析指针所有可能指向的对象。
- 别名分析:分析两个指针是否指向相同的对象,可通过指针分析来推导得到。
Alias information can be derived from points-to relations.
指针分析的应用
- Fundamental information
- Call graph, aliases, …
- Compiler optimization
- Virtual call inlining, …
- Bug detection
- Null pointer detection, …
- Security analysis
- Information flow analysis, …
- And many more …
三、Key Factors of Pointer Analysis
- Pointer analysis is a complex system
- Multiple factors affect the precision and efficiency of the system
Heap Abstraction:How to model heap memory
在程序动态执行时,对象数量是无限的(比如递归和循环中的变量创建)。而静态分析过程是有限的,需要终止。所以需要对静态分析时的对象进行抽象表达,将无限的对象抽象为有限。
Heap Abstraction的具体实现算法,目前业内有很多相关研究,其中“Allocation-Site”是应用最广泛的一种算法。
Allocation-Site:调用点抽象,将动态对象抽象成它们的创建点(Allocation-Site),来表示在该点创建的所有动态对象。Allocation-Site个数有限。
以下图的例子为例,虽然动态时对象的个数可能是无限的,但是new语句的个数一定是有限的。我们可以按照new语句来进行抽象。
Context Sensitivity:How to model calling contexts
所谓调用上下文(calling contexts)是指:跨函数时,不同callsite对应不同上下文(传入的参数不同,返回的值不同)。
调用上下文记录的是函数调用前后相关变量的值。例如,参数和返回值是上下文的一部分。
如果将上下文做区分(进行额外的标记,如记录下图中p指向的目标),对参数不同时的调用做不同的分析,则称为上下文敏感分析。
反之则称之为上下文不敏感分析,由于忽略了一部分信息,可能会损失分析的精度。
Flow Sensitivity:How to model control flow
- 流敏感分析重视语句执行的顺序,精度更高,但但优势不是特别大
- 流不敏感分析则恰恰相反,同时开销则远远小于前者
我们考虑这样一段代码,
对于流敏感的分析,会得到如下的mapping。o1代表在第一行动态分配的对象。
如果使用流不敏感的分析,会得到如下的mapping。
Analysis Scope:Which parts of program should be analyzed
可以分析整个程序,也可以按需分析(即只分析必要的部分)。
下面举一个例子,左边是对整个程序进行指针分析,右边是只针对z.bar()的相关调用所涉及到的变量进行指针分析。
四、Concerned Statements
关注的指针类型
JAVA指针分析需要关注的四种变量:
- Local variable: x
- Static field: C.f:Sometimes referred as global variable
- Instance field: x.f:Modeled as an object(pointed by x) with a field f
- Array element: array[i] 通常忽略下标之间的区别,将多个下标建模成一个(比如a[100]处理为a[0])
关注的语句类型
具体来说,我们关注五种基本类型的语句:
注意,复杂的Store和Load指令可以解构成简单的,所以我们可以只考虑对上述五种基本类型语句的分析:
相关文章
- 【VS开发】Caffelib中出现的问题:强制链接静态库所有符号(包括未被使用的)
- GNN-静态表征-相似度(一阶&二阶)-2016:SDNE【2个模型:一阶相似度(有监督) + 二阶相似度(无监督)-->两模型联合训练】【临接矩阵->自编码器->节点的向量表示】【同质图】
- 用户画像:概述【从应用角度来看,可以分为行为画像、健康画像、企业信用画像、个人信用画像、静态产品画像、旋转设备画像、社会画像、经济画像...】
- 学习逆向知识之用于游戏外挂的实现.第二讲,快速寻找植物大战僵尸阳光基址.以及动态基址跟静态基址的区别
- Effective Java 第三版——1. 考虑使用静态工厂方法替代构造方法
- 完美解决SpringMVC中静态资源无法找到(No mapping found for HTTP request with URI)问题
- Centos下添加静态路由(临时和永久有效)的操作记录
- 静态工具类中使用注解注入service
- Spring入门程序_04【静态工厂实例化,static,xml,test。。。。。。】
- ubuntu设置静态ip
- Java父类与子类中静态代码块 实例代码块 静态变量 实例变量 构造函数执行顺序
- 设计模式。单例、静态内部类方式(公认最完美的)
- 易语言 安装目录没有VC98linker 编译不成功 VC98linker静态连接器(迷你版),易语言VC98linker破解工具,修复静态编译。
- 南京大学 静态软件分析(static program analyzes)-- Soundness and Soundiness 学习笔记
- 南京大学 静态软件分析(static program analyzes)-- introduction 学习笔记
- 静态链表及 PTA 重组链表
- 【集合我能讲两小时056】在arraylist中,为什么有2个静态final修饰的object数组?