Post

NJU静态分析 - Lab3 - 死代码检测

NJU静态分析 - Lab3 - 死代码检测

分析

实验指导中的分析已经非常详尽,新增的类也没有太多难理解的地方,比如新增的IfSwitchStmt都是Stmt的实现,使用方式在Lab2中的DefinitionStmt已经体现。

实现这个Lab你需要完成两个部分,一个是将前两个Lab —— Live Variable Analysis和Constant Propagation的代码填入,并完成SolverWorkListSolver中空缺的部分,这一部分的实现建立在你通过前两个Lab的基础上,只要你前两个Lab的代码Accept了,就能非常轻松地解决。

第二个部分是完成死代码检测,死代码检测分三个部分,分别为Control Flow Unreachable、Branch Unreachable和Dead Assignments。其中Dead Assignments和Control Flow Unreachable的代码实现较为简单,前者对每一条AssignStmt检查语句的LValue在当前语句是否是live即可,后者则是对CFG进行一次BFS得到所有可达的语句。

比较复杂的Branch Unreachable,这里你需要根据实验指导所给的引导,去判断分支条件是否是一个Constant,如果是Constant,又会前往哪条分支。代码量较大,但难度不高。

建议可以先完成Dead Assignments和Control Flow Unreachable,通过对应的JUnit,然后完成Branch Unreachable。最后可以将Control Flow Unreachable和Branch Unreachable合并,因为实际上两者都是一个BFS,只不过后者是有条件的BFS罢了

踩过的坑

  • 在判断SwitchStmt的分支走向时,不要忘了default的存在
  • 不要忘了使用hasNoSideEffect函数去判断RValue是否会有副作用
  • 如果你在运行Loops这一个测试点的时候发现有一个Index为-1的nop语句也被放到了死代码中,可以检查一下是否是把CFG的Entry或Exit放到了死代码中
This post is licensed under CC BY 4.0 by the author.