【南大静态代码分析】作业 1:活跃变量分析和迭代求解器
生活随笔
收集整理的這篇文章主要介紹了
【南大静态代码分析】作业 1:活跃变量分析和迭代求解器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
作業 1:活躍變量分析和迭代求解器
題目鏈接:https://tai-e.pascal-lab.net/pa1.html
評測鏈接:https://oj.pascal-lab.net/problem
作業出品:南京大學《軟件分析》課程,譚添、李樾
實現活躍變量分析
-
newInitialFact:負責創建和初始化控制流圖中除了Entry和Exit之外的結點的Data Flow Fact。
控制流圖中一個結點的 IN 和 OUT 分別對應一個 Data Flow Fact ,記錄當前程序點時變量的狀態。
直接創建一個空的 CPFact 即可,方法體內還沒有開始掃描。
@Override
public SetFact<Var> newInitialFact() {
// TODO - finish me
return new SetFact<>();
}
-
newBoundaryFact:負責創建和初始化虛擬結點的Data Flow Fact。但是注意要把方法參數初始化為NAC。
@Override
public SetFact<Var> newBoundaryFact(CFG<Stmt> cfg) {
// TODO - finish me
return new SetFact<>();
}
-
meetInto:負責處理transfer function之前可能遇到多個OUT時的合并處理。
直接調用接口就行了。
@Override
public void meetInto(SetFact<Var> fact, SetFact<Var> target) {
// TODO - finish me
target.union(fact);
}
-
transferNode:負責實現控制流圖中結點的transfer function。如果IN改變,返回true;否則返回false。
@Override
public boolean transferNode(Stmt stmt, SetFact<Var> in, SetFact<Var> out) {
// TODO - finish me
// IN = OUT \cup (use - def)
Optional<LValue> def = stmt.getDef();
List<RValue> uses = stmt.getUses();
SetFact<Var> newSetFact = new SetFact<>();
newSetFact.union(out);
if (def.isPresent()) {
LValue defValue = def.get();
if (defValue instanceof Var) {
newSetFact.remove((Var) defValue);
}
}
for (RValue use : uses) {
if (use instanceof Var) {
newSetFact.add((Var) use);
}
}
if (!in.equals(newSetFact)) {
in.set(newSetFact);
return true;
}
return false;
}
實現迭代求解器
-
doSolveBackward:完成 while 循環。
@Override
protected void doSolveBackward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {
// TODO - finish me
boolean flag = true;
while (flag) {
flag = false;
for (Node node : cfg) {
if (cfg.isExit(node)) continue;
Fact outFact = result.getOutFact(node);
Fact inFact = result.getInFact(node);
for (Node succs : cfg.getSuccsOf(node)) {
Fact succsInFact = result.getInFact(succs);
analysis.meetInto(succsInFact, outFact);
}
if (analysis.transferNode(node, inFact, outFact)) {
flag = true;
}
}
}
}
-
initializeBackward:實現算法前三行的初始化操作。
protected void initializeBackward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {
// TODO - finish me
// Init Exit node
result.setInFact(cfg.getExit(), analysis.newBoundaryFact(cfg));
// Init other nodes
for (Node node : cfg) {
if (!cfg.isExit(node)) {
result.setInFact(node, analysis.newInitialFact());
result.setOutFact(node, analysis.newInitialFact());
}
}
}
評測結果
總結
以上是生活随笔為你收集整理的【南大静态代码分析】作业 1:活跃变量分析和迭代求解器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新接手一个业务系统,我是这么熟悉的
- 下一篇: Feign源码解析7:nacos loa