【南大静态代码分析】作业 1:活跃变量分析和迭代求解器
生活随笔
收集整理的這篇文章主要介紹了
【南大静态代码分析】作业 1:活跃变量分析和迭代求解器
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作業(yè) 1:活躍變量分析和迭代求解器
題目鏈接:https://tai-e.pascal-lab.net/pa1.html
評(píng)測(cè)鏈接:https://oj.pascal-lab.net/problem
作業(yè)出品:南京大學(xué)《軟件分析》課程,譚添、李樾
實(shí)現(xiàn)活躍變量分析
-
newInitialFact:負(fù)責(zé)創(chuàng)建和初始化控制流圖中除了Entry和Exit之外的結(jié)點(diǎn)的Data Flow Fact。
控制流圖中一個(gè)結(jié)點(diǎn)的 IN 和 OUT 分別對(duì)應(yīng)一個(gè) Data Flow Fact ,記錄當(dāng)前程序點(diǎn)時(shí)變量的狀態(tài)。
直接創(chuàng)建一個(gè)空的 CPFact 即可,方法體內(nèi)還沒有開始掃描。
@Override
public SetFact<Var> newInitialFact() {
// TODO - finish me
return new SetFact<>();
}
-
newBoundaryFact:負(fù)責(zé)創(chuàng)建和初始化虛擬結(jié)點(diǎn)的Data Flow Fact。但是注意要把方法參數(shù)初始化為NAC。
@Override
public SetFact<Var> newBoundaryFact(CFG<Stmt> cfg) {
// TODO - finish me
return new SetFact<>();
}
-
meetInto:負(fù)責(zé)處理transfer function之前可能遇到多個(gè)OUT時(shí)的合并處理。
直接調(diào)用接口就行了。
@Override
public void meetInto(SetFact<Var> fact, SetFact<Var> target) {
// TODO - finish me
target.union(fact);
}
-
transferNode:負(fù)責(zé)實(shí)現(xiàn)控制流圖中結(jié)點(diǎn)的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;
}
實(shí)現(xiàn)迭代求解器
-
doSolveBackward:完成 while 循環(huán)。
@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:實(shí)現(xiàn)算法前三行的初始化操作。
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());
}
}
}
評(píng)測(cè)結(jié)果
總結(jié)
以上是生活随笔為你收集整理的【南大静态代码分析】作业 1:活跃变量分析和迭代求解器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新接手一个业务系统,我是这么熟悉的
- 下一篇: Feign源码解析7:nacos loa