NJU静态分析 - Lab2 - 常量传播和WorkList求解器
NJU静态分析 - Lab2 - 常量传播和WorkList求解器
分析
对于算法的分析,课程视频已经讲解地非常清晰,在此不多赘述。重点关注于代码框架的分析
pascal.taie.ir.IR
这个类的每个实例存储了一个Java方法的各种信息,例如变量、参数、语句等。由于我们目前做的是Intraprocedual-analysis,因此我们只需要关注一个IR对象中的信息,在这个Lab中,IR
中最重要的信息是其参数,因为目前我们需要将函数参数的Value
初始化为NAC
,这会在newBoundaryFact
中用到。
pascal.taie.ir.exp.Exp
Exp
有三个实现,分别为Var
、IntLiteral
和BinaryExp
,在编写程序的时候需要去判断一个Exp
到底归属于哪一个子类,再作出对应的操作。主要会在transferNode
和evaluate
函数中体现。
pascal.taie.ir.stmt.DefinitionStmt
DefinitionStmt
是Stmt
的一个实现,表示了Definition语句,而本次的常量传播算法主要聚焦于Definition语句,因此该类对于判断一个Stmt
是否是Definition语句有很关键的作用。
pascal.taie.analysis.dataflow.analysis.constprop.Value
Value
有三种类型:UNDEF
、NAC
和Constant
,在Meet阶段和Transfer阶段中,对于同一变量的不同来源,需要根据多个来源的类型判断该变量在下一阶段的类型,这些转换函数参见课程视频和PPT
踩过的坑
- 在
evaluate
中,关于除以0的情况,并不是只有在两个数均是Constant
的时候才需要考虑,而是只要两个数都不是UNDEF
时,被除数是0就要触发这一种特殊情况 - 在使用一个
DefinitionStmt
的LValue
时,一定要判断其是否是Var
,不然可能会引发Exception - 当你有一些测试点过不了时,可以看看有些地方是不是漏加了
canHoldInt
的判断 - 当你不知道你要做什么时,可以多打印一些类,看看这些类到底储存了什么信息
完整代码
应Acadmic Integrity要求,不呈现完整代码,但只要一步一步复现课程视频、PPT和实验指导中的算法,加上作者踩过的坑,一定能写出Accept的代码
This post is licensed under CC BY 4.0 by the author.