您好,登錄后才能下訂單哦!
這篇文章主要介紹“go-callvis源碼是什么”,在日常操作中,相信很多人在go-callvis源碼是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”go-callvis源碼是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
go-callvis 是一個可視化調用調用鏈路圖的靜態源碼分析工具
https://github.com/ofabry/go-callvis
它的實現非常簡潔
examples handler.go output.goMakefile analysis.go go.mod images version.goREADME.md dot.go go.sum main.go
首先看下main.go文件
首先解析了一系列參數然后調用
Analysis = new(analysis) if err := Analysis.DoAnalysis("", tests, args); err != nil { log.Fatal(err) }
最后起了一個http服務,可以支持在線可視化
type analysis struct { opts *renderOpts prog *ssa.Program pkgs []*ssa.Package mains []*ssa.Package result *pointer.Result}
定義在analysis.go文件里,重點是通過下面這個函數進行代碼分析的
func (a *analysis) DoAnalysis( dir string, tests bool, args []string,) error
調用
"golang.org/x/tools/go/packages"
里面的
initial, err := packages.Load(cfg, args...)
加載包里面所有的文件,然后調用
"golang.org/x/tools/go/ssa/ssautil"
里面的
prog, pkgs := ssautil.AllPackages(initial, 0) prog.Build()
對源碼進行ssa轉化
然后找到入口的main函數
mains, err := mainPackages(pkgs)
就是判斷包名和函數名
p.Pkg.Name() == "main" && p.Func("main")
然后用
"golang.org/x/tools/go/pointer"
的指針分析,進行依賴分析
result, err := pointer.Analyze(config)
至此,完成了源碼的依賴分析,然后應用dot語言,轉化成圖像。
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中被引入,這個特性對編譯器的性能有很大的提高,但是也導致編譯過程有些減速。下面來結合網上的資糧和書籍,簡單說明一下SSA以及SSA的應用。
SSA 代表 static single-assignment,是一種IR(中間表示代碼),要保證每個變量只被賦值一次。這個能幫助簡化編譯器的優化算法。
y := 1
y := 2
x := y
比如上面這段代碼,y = 1
其實是不可用的,這個要通過定義的可達分析來確定y
是要用1還是2,而SSA有一個標識符可以稱之為版本或者“代“。
y1 := 1
y2 := 2
x1 := y2
這樣就沒有任何間接值了。用SSA表示的好處是對于同一個變量的無關使用表示成不同“代”,可以方便很多編譯器的優化算法的實現。
指向分析是一種用于分析指針和內存引用所指向的變量或內存地址的靜態代碼分析技術。指向分析技術是很多更為復雜的代碼分析技術的基礎,例如編譯優化,代碼缺陷檢測以及指針修改影響分析。
指向分析,是指通過對源程序的分析近似地求出源程序中指針表達式所指向的目標。
到此,關于“go-callvis源碼是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。