1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        go-callvis 源碼分析

        共 2075字,需瀏覽 5分鐘

         ·

        2021-05-15 13:34

        go-callvis 是一個可視化調(diào)用調(diào)用鏈路圖的靜態(tài)源碼分析工具

        https://github.com/ofabry/go-callvis

        它的實現(xiàn)非常簡潔

        examples        handler.go      output.goMakefile        analysis.go     go.mod          images          version.goREADME.md       dot.go          go.sum          main.go

        首先看下main.go文件

        首先解析了一系列參數(shù)然后調(diào)用

          Analysis = new(analysis)  if err := Analysis.DoAnalysis("", tests, args); err != nil {    log.Fatal(err)  }

        最后起了一個http服務(wù),可以支持在線可視化


        type analysis struct {  opts   *renderOpts  prog   *ssa.Program  pkgs   []*ssa.Package  mains  []*ssa.Package  result *pointer.Result}

        定義在analysis.go文件里,重點是通過下面這個函數(shù)進(jìn)行代碼分析的

        func (a *analysis) DoAnalysis(  dir string,  tests bool,  args []string,) error

        調(diào)用

          "golang.org/x/tools/go/packages"

        里面的

          initial, err := packages.Load(cfg, args...)

        加載包里面所有的文件,然后調(diào)用

        "golang.org/x/tools/go/ssa/ssautil"

        里面的

          prog, pkgs := ssautil.AllPackages(initial, 0)  prog.Build()

        對源碼進(jìn)行ssa轉(zhuǎn)化

        然后找到入口的main函數(shù)

        mains, err := mainPackages(pkgs)

        就是判斷包名和函數(shù)名

         p.Pkg.Name() == "main" && p.Func("main")

        然后用

        "golang.org/x/tools/go/pointer"

        的指針分析,進(jìn)行依賴分析

        result, err := pointer.Analyze(config)

        至此,完成了源碼的依賴分析,然后應(yīng)用dot語言,轉(zhuǎn)化成圖像。

        func outputDot(fname string, outputFormat string) {  // get cmdline default for analysis  Analysis.OptsSetup()
        if e := Analysis.ProcessListArgs(); e != nil { log.Fatalf("%v\n", e) }
        output, err := Analysis.Render()


        SSA在Go1.7中被引入,這個特性對編譯器的性能有很大的提高,但是也導(dǎo)致編譯過程有些減速。下面來結(jié)合網(wǎng)上的資糧和書籍,簡單說明一下SSA以及SSA的應(yīng)用。

        SSA 代表 static single-assignment,是一種IR(中間表示代碼),要保證每個變量只被賦值一次。這個能幫助簡化編譯器的優(yōu)化算法。

         y := 1
        y := 2
        x := y

        比如上面這段代碼,y = 1其實是不可用的,這個要通過定義的可達(dá)分析來確定y是要用1還是2,而SSA有一個標(biāo)識符可以稱之為版本或者“代“。

         y1 := 1
        y2 := 2
        x1 := y2

        這樣就沒有任何間接值了。用SSA表示的好處是對于同一個變量的無關(guān)使用表示成不同“代”,可以方便很多編譯器的優(yōu)化算法的實現(xiàn)。

        指向分析是一種用于分析指針和內(nèi)存引用所指向的變量或內(nèi)存地址的靜態(tài)代碼分析技術(shù)。指向分析技術(shù)是很多更為復(fù)雜的代碼分析技術(shù)的基礎(chǔ),例如編譯優(yōu)化,代碼缺陷檢測以及指針修改影響分析。

        指向分析,是指通過對源程序的分析近似地求出源程序中指針表達(dá)式所指向的目標(biāo)。



        推薦閱讀


        福利

        我為大家整理了一份從入門到進(jìn)階的Go學(xué)習(xí)資料禮包,包含學(xué)習(xí)建議:入門看什么,進(jìn)階看什么。關(guān)注公眾號 「polarisxu」,回復(fù) ebook 獲取;還可以回復(fù)「進(jìn)群」,和數(shù)萬 Gopher 交流學(xué)習(xí)。

        瀏覽 62
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            久久人体视频 | 国产波霸巨爆乳无码视频在线 | gayfreevideos亚洲男男 | 国产日韩欧美久久久 | 亚洲午夜中文字幕 | 日韩精品内射 | 国产又爽又黄A片 | 天天综合网,7799精品视频天天看 | 国产日韩精品欧美一区二区三区 | 小黄片资源|