日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

【南大静态代码分析】作业 1:活跃变量分析和迭代求解器

發布時間:2024/1/21 windows 32 coder
生活随笔 收集整理的這篇文章主要介紹了 【南大静态代码分析】作业 1:活跃变量分析和迭代求解器 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

作業 1:活躍變量分析和迭代求解器

題目鏈接:https://tai-e.pascal-lab.net/pa1.html

評測鏈接:https://oj.pascal-lab.net/problem

作業出品:南京大學《軟件分析》課程,譚添、李樾

實現活躍變量分析

  • newInitialFact :負責創建和初始化控制流圖中除了 EntryExit 之外的結點的 Data Flow Fact

控制流圖中一個結點的 INOUT 分別對應一個 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:活跃变量分析和迭代求解器的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。