<kbd id="5sdj3"></kbd>
<th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>

    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文件里,重點(diǎn)是通過下面這個函數(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
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報
    評論
    圖片
    表情
    推薦
    點(diǎn)贊
    評論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報

    <kbd id="5sdj3"></kbd>
    <th id="5sdj3"></th>

  • <dd id="5sdj3"><form id="5sdj3"></form></dd>
    <td id="5sdj3"><form id="5sdj3"><big id="5sdj3"></big></form></td><del id="5sdj3"></del>

  • <dd id="5sdj3"></dd>
    <dfn id="5sdj3"></dfn>
  • <th id="5sdj3"></th>
    <tfoot id="5sdj3"><menuitem id="5sdj3"></menuitem></tfoot>

  • <td id="5sdj3"><form id="5sdj3"><menu id="5sdj3"></menu></form></td>
  • <kbd id="5sdj3"><form id="5sdj3"></form></kbd>
    无码免费一区二区三区免费播放 | 在线一级二级免费观看视频 | 国产伦精品一区二区三区最新章节 | 国产美女被日 | 狠狠爱大香蕉 |