NJU静态分析 - Lab4 - 类层次结构分析与过程间常量传播
NJU静态分析 - Lab4 - 类层次结构分析与过程间常量传播
分析
CHABuilder
三个算法在PPT中都有,一步一步实现即可
Edge Transfer
在这一部分,有一些比较有意思的点。首先原本的transferNode
函数被分为了transferCallNode
和transferNonCallNode
,这是为什么呢。在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.