Motivation(动机)

因为 CHA 不准确,所以要进行指针分析
Introduction to Pointer Analysis
基本信息
- 研究一个指针可以指向那些内存位置
 - 在面向对象(OO)语言中,研究一个指针可以指向那些对象
 - 是一个 may analysis,只要有可能指向就要添加进入指向的集合中
 - 区别于别名分析(Alias Analysis):研究两个指针可不可以指向同一个对象
 - 是最最最基础的静态分析。
 
Key Factors of Pointer Analysis
很多因素会影响指针分析的精度和效率
| Factor | Problem(研究什么) | Choice(本课程会学习) | 
|---|---|---|
| heap abstraction(堆抽象) | 怎么对堆内存进行建模 | allocation-site | 
| context sensitivity(上下文敏感性) | 怎么建模调用上下文 | context-sensitive context-insensitive | 
| flow sensitivity(流敏感性) | 怎么建模控制流信息 | flow-insensitive | 
| analysis scope(分析域) | 分析程序的哪些部分 | whole-program | 
heap abstraction
- 在动态执行中,由于循环和递归,堆对象的数量可以不受限制
 - 为了确保终止,堆抽象将动态分配的无界具体对象建模为静态分析的有限抽象对象
 

allocation-site
根据具体对象的 allocation-site 对其建模,即在每一个 allocation-site 建立一个抽象对象来表示在这个 allocation-site 分配的所有具体对象(allocation-site 可以理解为程序的某一行)

由于程序的 allocation-site 有限,所以抽象对象肯定有限
context sensitivity
| context-sensitive | context-insensitive | 
|---|---|
| 区分方法的不同调用上下文 | 合并一个方法的所有调用上下文 | 
| 对每个方法的多个上下文一一进行分析 | 每个方法分析一次(合并控制流会丢失精度) | 
flow sensitivity
| flow-sensitive | flow-insensitive | 
|---|---|
| 尊重语句的执行顺序 | 忽略控制流的顺序 | 
| 在每个程序位置维护点到关系的映射 | 为整个程序维护一个点到关系的映射 | 

analysis scope
| whole-program | demand-program | 
|---|---|
| 计算程序中所有指针的指向信息 | 仅计算特定感兴趣的 site 的指针指向信息 | 
| 为所有可能的需求提供信息 | 只提供特定信息 | 
Concerned Statements

只关心可能引起指针指向对象变化的语句,就上面 5 种
重点问题
什么是指针分析
指针分析是计算机科学领域的一个概念,主要用于程序静态分析和优化。在程序中,指针是一种数据类型,用于存储内存地址,可以指向其他变量或数据结构。指针分析旨在确定程序中的指针可以指向哪些内存位置,以及在程序执行期间可能出现的情况。
指针分析的主要目标包括:
- 
    
指针关系分析:确定指针变量可能指向的内存位置。这可以帮助理解程序中数据的流动和依赖关系。
 - 
    
指针别名分析:确定程序中哪些指针可能引用同一内存位置,即别名。这对于优化程序以及检测潜在的错误非常重要。
 - 
    
空指针分析:检测程序中可能存在的空指针引用,以避免潜在的崩溃或错误。
 - 
    
指针的生命周期分析:确定指针何时创建、使用和销毁,以便进行资源管理和优化。
 
指针分析在编译器优化、程序验证和安全性分析等领域都有广泛的应用。通过有效的指针分析,可以帮助开发人员理解和改进程序的性能、可靠性和安全性。
理解指针分析的关键影响因素
堆抽象,上下文敏感性与否,流敏感与否,分析域大小
理解我们在指针分析中分析什么
new 语句,store 语句,load 语句,赋值语句,调用语句