指针分析

时间:2021-08-11
本文章向大家介绍指针分析,主要包括指针分析使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

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表示程序中的指向关系(映射)。

 
7-1-1-标记方法.png

规则:采用推导形式,横线上面是条件,横线下面是结论。

  • New:创建对象,将new T()对应的对象oi加入到x的指针集。
  • Assign:将y的指针集加入到x对应的指针集。
  • Store:让oi的field指向oj
  • Load:Store的反操作。


     
    7-1-2-规则.png



链接:https://www.jianshu.com/p/5cbc5bb5c4da

原文地址:https://www.cnblogs.com/rsapaper/p/15127052.html