指针分析 Pointer Analysis
github.com/gosnmp/gosnmp@v1.32.0/gosnmp.go:133
rxBuf *[rxBufSize]byte // has to be pointer due to https://github.com/golang/go/issues/11728
指针分析/Point-to Analysis/Reference Analysis - 知乎 https://zhuanlan.zhihu.com/p/79804033
指针分析的目的
对于任何一个指针/引用,能否在编译阶段就知道它会指向内存那块位置(位置在这里并不是0xFFFF这样的具体位置,而是说指向哪个stack/heap上local/object)呢? 通过把停机问题reduced to, 能证明指针问题是不可决定的。也就是不能对任何指针都准确的分析出它会确切指向哪。但这不妨碍我们求出近似解,从而在某些情况下能作出优化。 因此我们把问题转化为: 对于任何一个任何指针,能否在编译阶段知道它所有可能(may)指向的位置? 最简单的回答自然是不知道(top), 这种回答没有实际意义,我们要的是更"紧"的答案。
软件分析笔记4:指针分析 - crossain - 博客园 https://www.cnblogs.com/crossain/p/12767883.html
2.Introduction to pointer analysis
指针分析是最基础的静态分析,它最早的研究是从40多年之前开始的,它回答了程序中的指针指向哪个内存的问题,Java语言中的指针分析指的是一个指针指向程序中的哪个对象(Object)的问题.通常指针分析是一个may-analysis,分析的结果通常是一个指针可能指向哪些对象。
我们用一个实例来解释指针分析的内容:
如上图所示,对于左边的程序代码,通过分析前两句代码我们可以得到变量a指向new A(),变量x指向new B(),对于a.setB()方法很明显是指向A类中的对应方法,而对于setB()方法,方法中的this会指向new A()因为foo()中是a调用的setB()方法,而方法中的形参b则是由实参x传给他的,指向new B();因此对于setB方法中的“this.b = b;”,是new A.b指向了new B。
指针分析的输入就是一个程序代码,然后输出一个指向关系。
注意
指针分析和别名分析(aliases)有很多相似之处,但是指针分析并不等于别名分析,二者区别如下:
-
指针分析解答的是一个指针可能指向哪个对象的问题
-
别名分析解答的是两个指针是否能指向同一个对象的问题,如果是就认为二者互为别名。如下图所示:
- 别名分析可以通过指针分析推导出来。
指针分析的应用
- 可以用来计算其他基本信息(别名分析,调用图...)
- 编译优化
- 找Bug
- 安全性分析
- 等等......
指针分析是最基础的静态分析之一,也是很多其他分析的基础。
Programming Language Design and Program Analysis http://staff.ustc.edu.cn/~yuzhang/pldpa/
【课程笔记】南大软件分析课程7——指针分析基础(课时9/10) - 简书 https://www.jianshu.com/p/5cbc5bb5c4da
1.指针分析规则
首先分析前4种语句:New / Assign / Store / Load。
指针分析的域和相应的记法:变量/函数/对象/实例域/指针,用pt表示程序中的指向关系(映射)。
规则:采用推导形式,横线上面是条件,横线下面是结论。
- New:创建对象,将
new T()
对应的对象oi加入到x的指针集。 - Assign:将y的指针集加入到x对应的指针集。
- Store:让oi的field指向oj。
-
Load:Store的反操作。
链接:https://www.jianshu.com/p/5cbc5bb5c4da
http://staff.ustc.edu.cn/~yuzhang/pldpa/notes/A9PointerAnalysis.pdf