A1:活跃变量分析和迭代求解器
CFG<Node>是一种图类型,Node包含了BB的语句,Fact包含是bitVector,其中DataflowResult<Node, Fact>
是一个LinkedHashMap,键是Node值是Fact。
pascal.taie.analysis.dataflow.analysis.LiveVariableAnalysis
/**
* Implementation of classic live variable analysis.
*/
public class LiveVariableAnalysis extends
AbstractDataflowAnalysis<Stmt, SetFact<Var>> {
public static final String ID = "livevar";
public LiveVariableAnalysis(AnalysisConfig config) {
super(config);
}
@Override
public boolean isForward() {
return false;
}
@Override
public SetFact<Var> newBoundaryFact(CFG<Stmt> cfg) {
// TODO - finish me
return new SetFact<Var>();
}
@Override
public SetFact<Var> newInitialFact() {
// TODO - finish me
return new SetFact<Var>();
}
@Override
public void meetInto(SetFact<Var> fact, SetFact<Var> target) {
// TODO - finish me
target.union(fact);
}
@Override
public boolean transferNode(Stmt stmt, SetFact<Var> in, SetFact<Var> out) {
// TODO - finish me
// 获取语句左值中的定义,最多为一个
Optional<LValue> def = stmt.getDef();
// 获取语句中的右值,右值可能有多个,使用List存起来
List<RValue> uses = stmt.getUses();
// 定义算法中的IN[]
SetFact<Var> newSetFact = new SetFact<>();
// 将OUT[]中的值union到IN[]
newSetFact.union(out);
if(def.isPresent()) {
// 如果左值是一个变量
if(def.get() instanceof Var) {
// 那么就在IN[]中kill掉
newSetFact.remove((Var) def.get());
}
}
// 遍历右值中的每一个元素
for (RValue use : uses) {
// 如果它是一个变量
if (use instanceof Var) {
// 那么就Gen一个对应的
newSetFact.add((Var) use);
}
}
// 如果本次的IN[]和经历过Gen&Kill过后的IN[]不一样
if (!in.equals(newSetFact)) {
// 那么就更新IN[]
in.set(newSetFact);
return true;
}
return false;
}
}pascal.taie.analysis.dataflow.solver.Slover#initializeBackward
protected void initializeBackward(CFG<Node> cfg, DataflowResult<Node, Fact> result) {
// TODO - finish me
// step1 将 exit节点的InFact置为空集
result.setInFact(cfg.getExit(), analysis.newBoundaryFact(cfg));
// step2 将 除了exit节点之外的其他节点的InFact和OutFact置为空集
for (Node node : cfg.getNodes()) {
if (cfg.isExit(node)) continue;
result.setInFact(node, analysis.newInitialFact());
// 将OutFact也置为空集
result.setOutFact(node, analysis.newInitialFact());
}
}pascal.taie.analysis.dataflow.solver.IterativeSolver#doSolveBackward
@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; // 出口节点不需要特殊处理
// 获取当前节点的 OUT 和 IN
Fact outFact = result.getOutFact(node);
Fact inFact = result.getInFact(node);
// 对于每个节点,调用函数 meetInto 和 transferNode (DataflowAnalysis 中)
for (Node succs : cfg.getSuccsOf(node)) {
// DataflowResult是存储着Node-Fact表,这里通过Node得到对应的Fact
Fact succsInFact = result.getInFact(succs);
// meet操作
analysis.meetInto(succsInFact, outFact);
}
if (analysis.transferNode(node, inFact, outFact)) {
flag = true;
}
}
}
}A2:常量传播和 Worklist 求解器
2024-12-08 17:24:40 (GMT+08:00) ERROR analysis has "Exception" on [hidden] testcase(s)
Analyze 53 methods, pass 51 methods
There are 485 Stmts in all test cases
Your submission correctly analyzes 476 Stmts
[!] Failed on [hidden] testcase(s)
Tips: we will not give you any information about [hidden] testcase(s)