大家好,我是煎魚。
風水輪流轉,Go 程序寫多了。總是會這有點問題,那有點問題。問題積累久了就容易出點事件,甚至是事故。
這種時候大家往往會想著引入一些靜態分析工具來解決這個問題。元旦假期時剛好看到這個新輪子,分享給大家!
最近 Uber 開發和開源了一個挺不錯的靜態分析工具 NilAway:
圖片
使用場景是:在 Go 程序編譯時就能捕獲 nil,達到幫助開發人員規避在生產中出現 nil panic 的問題。
官方認為其具備以下三個重要的特點,讓其脫穎而出:
我們只需要在命令行執行如下命令安裝:
$ go install go.uber.org/nilaway/cmd/nilaway@latest
nilaway 能夠遍歷掃描目錄下的所有文件:
$ nilaway ./...
也可以掃描單獨的文件:
$ nilaway demo.go
注:本文安裝 @latest 的原因,是因為寫此文時 nilaway 還在積極開發階段,暫時沒有發布正式的版本。如果后續有正式版本,也可以指定相應版本號。
看看如下的代碼,是在什么場景下有問題:
var p *Pif someCondition { p = &P{}}print(p.f) // nilness reports NO error here, but NilAway does.
在上述代碼中,當 someCondition 變量值為 true 時,才會初始化結構體 P。如果 someCondition 變量為 false 時,就會出現空指針調用的 panic 問題。
NilAway 工具可以捕獲這種錯誤并報告,會報告如下錯誤:
go.uber.org/example.go:12:9: error: Potential nil panic detected. Observed nil flow from source to dereference point: -> go.uber.org/example.go:12:9: unassigned variable `p` accessed field `f`
如果我們增加 if p != nil 來做防御,報告的錯誤就會消失。
看看如下的代碼,是為什么有問題:
func foo() *int { return nil}func bar() { print(*foo())}func main() { // 煎魚正在干點什么... bar() // nilness reports NO error here, but NilAway does.}
函數 foo 返回了一個 nil 指針,該指針在函數 bar 中被直接取消引用,導致每當調用函數 bar 時都會出現 panic 問題。
NilAway 工具也能捕獲這類跨函數的的問題,會報告如下錯誤:
? ~ nilaway demo.go /Users/eddycjy/demo.go:7:9: error: Potential nil panic detected. Observed nil flow from source to dereference point: -> eddycjy/demo.go:4:9: literal `nil` returned from `foo()` in position 0 -> eddycjy/demo.go:7:9: result 0 of `foo()` dereferenced
上面的例子雖然是同 package 內跨函數的問題識別,但實際上該工具也嫩能夠分析跨 package 的調用。
今天針對 Go 里最常見的 nil 指針問題進行了靜態分析工具 NilAway 的分享。雖然目前該工具還沒有正式的生產可用。
可以明確的是這是大家在 Go 應用上常碰到的場景,可以多加關注后續的更新。另外 NilAway 是基于 go/analysis 標準開發的,后續可以接入 golangci-lint 等相關工具。大家可以繼續保持關注!
本文鏈接:http://www.www897cc.com/showinfo-26-56550-0.htmlUber Go 出了個靜態分析工具 NilAway,還挺實用!
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com
上一篇: JS小知識,分享十個有用 JavaScript 小技巧
下一篇: 圖形編輯器開發:縮放和旋轉控制點