Post

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有三个实现,分别为VarIntLiteralBinaryExp,在编写程序的时候需要去判断一个Exp到底归属于哪一个子类,再作出对应的操作。主要会在transferNodeevaluate函数中体现。

pascal.taie.ir.stmt.DefinitionStmt

DefinitionStmtStmt的一个实现,表示了Definition语句,而本次的常量传播算法主要聚焦于Definition语句,因此该类对于判断一个Stmt是否是Definition语句有很关键的作用。

pascal.taie.analysis.dataflow.analysis.constprop.Value

Value有三种类型:UNDEFNACConstant,在Meet阶段和Transfer阶段中,对于同一变量的不同来源,需要根据多个来源的类型判断该变量在下一阶段的类型,这些转换函数参见课程视频和PPT

踩过的坑

  • evaluate中,关于除以0的情况,并不是只有在两个数均是Constant的时候才需要考虑,而是只要两个数都不是UNDEF时,被除数是0就要触发这一种特殊情况
  • 在使用一个DefinitionStmtLValue时,一定要判断其是否是Var,不然可能会引发Exception
  • 当你有一些测试点过不了时,可以看看有些地方是不是漏加了canHoldInt的判断
  • 当你不知道你要做什么时,可以多打印一些类,看看这些类到底储存了什么信息

完整代码

应Acadmic Integrity要求,不呈现完整代码,但只要一步一步复现课程视频、PPT和实验指导中的算法,加上作者踩过的坑,一定能写出Accept的代码

This post is licensed under CC BY 4.0 by the author.