Post

NJU静态分析 - Lab4 - 类层次结构分析与过程间常量传播

NJU静态分析 - Lab4 - 类层次结构分析与过程间常量传播

分析

CHABuilder

三个算法在PPT中都有,一步一步实现即可

Edge Transfer

在这一部分,有一些比较有意思的点。首先原本的transferNode函数被分为了transferCallNodetransferNonCallNode,这是为什么呢。在Lab2的Intraprocedual Analysis中,我们将函数调用的返回结果默认为NAC。而在当前的Lab,我们则更进一步,使用了Interprocedual Analysis,函数调用的返回结果不再保守地当作NAC,因此需要用transferCallNode去书写新代码,不再使用先前的transferNode函数。至于怎么书写,已经呼之欲出了。

第二个便是在书写transferReturnEdge时,会遇到返回的变量个数大于1的情况,这时候便和Lab2中的Meet操作很像,可以直接复用代码,非常简洁。

Worklist求解器

按照实验指导的要求即可

踩过的坑

  • 在实现 transfer*Edge() 方法的时候,一定不要修改函数的第二个参数,需要新Fact时可以用copy函数
  • 在实现Worklist求解器时,你应该将icfg中的所有Node加入worklist中,而并非只先加入Entry的所有Node,这样在后续处理时会增加很多不必要的麻烦
  • 在更新worklist的时候,可以判断一下当前新加入节点是否已经在队列中,如果已有,就不用再加入了。原因在于,如果队列中已经存在要新加入的节点,当前的节点一定在该已存在节点之前,因此当前节点的Out改变一定能传播到要新加入的节点
  • 一定要无偏差地实现PPT中的算法,其中的每一句都不是多余的。
This post is licensed under CC BY 4.0 by the author.