您好,登錄后才能下訂單哦!
這篇文章主要介紹“go-callvis源碼是什么”,在日常操作中,相信很多人在go-callvis源碼是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go-callvis源碼是什么”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
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ù)進行代碼分析的
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()
對源碼進行ssa轉(zhuǎn)化
然后找到入口的main函數(shù)
mains, err := mainPackages(pkgs)
就是判斷包名和函數(shù)名
p.Pkg.Name() == "main" && p.Func("main")
然后用
"golang.org/x/tools/go/pointer"
的指針分析,進行依賴分析
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
其實是不可用的,這個要通過定義的可達分析來確定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)化,代碼缺陷檢測以及指針修改影響分析。
指向分析,是指通過對源程序的分析近似地求出源程序中指針表達式所指向的目標(biāo)。
到此,關(guān)于“go-callvis源碼是什么”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。