新聞中心
大家好,我是煎魚。

我們擁有10余年網(wǎng)頁設(shè)計(jì)和網(wǎng)站建設(shè)經(jīng)驗(yàn),從網(wǎng)站策劃到網(wǎng)站制作,我們的網(wǎng)頁設(shè)計(jì)師為您提供的解決方案。為企業(yè)提供成都網(wǎng)站制作、網(wǎng)站設(shè)計(jì)、微信開發(fā)、微信小程序開發(fā)、手機(jī)網(wǎng)站制作設(shè)計(jì)、html5、等業(yè)務(wù)。無論您有什么樣的網(wǎng)站設(shè)計(jì)或者設(shè)計(jì)方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設(shè)計(jì)服務(wù)并滿足您的需求。
風(fēng)水輪流轉(zhuǎn),Go 程序?qū)懚嗔???偸菚@有點(diǎn)問題,那有點(diǎn)問題。問題積累久了就容易出點(diǎn)事件,甚至是事故。
這種時候大家往往會想著引入一些靜態(tài)分析工具來解決這個問題。元旦假期時剛好看到這個新輪子,分享給大家!
NilAway 分析工具
最近 Uber 開發(fā)和開源了一個挺不錯的靜態(tài)分析工具 NilAway:
圖片
使用場景是:在 Go 程序編譯時就能捕獲 nil,達(dá)到幫助開發(fā)人員規(guī)避在生產(chǎn)中出現(xiàn) nil panic 的問題。
官方認(rèn)為其具備以下三個重要的特點(diǎn),讓其脫穎而出:
- 完全自動化:該分析工具只需要用戶提供標(biāo)準(zhǔn)的 Go 代碼就可以使用了。不需要其他任何額外的信息。
- 速度快:在設(shè)計(jì)上,NilAway 保持速度快且可擴(kuò)展,目標(biāo)是大型代碼庫也可以使用。在官方的性能測量中,啟用 NilAway 時構(gòu)建時間開銷不到 5%。
- 很實(shí)用:它不能防止代碼中所有可能的 nil panic,但能捕獲我們在生產(chǎn)中觀察到的大部分潛在 nil panic,從而使 NilAway 在實(shí)用性和構(gòu)建時間開銷之間保持良好的平衡。
安裝
我們只需要在命令行執(zhí)行如下命令安裝:
$ go install go.uber.org/nilaway/cmd/nilaway@latestnilaway 能夠遍歷掃描目錄下的所有文件:
$ nilaway ./...也可以掃描單獨(dú)的文件:
$ nilaway demo.go注:本文安裝 @latest 的原因,是因?yàn)閷懘宋臅r nilaway 還在積極開發(fā)階段,暫時沒有發(fā)布正式的版本。如果后續(xù)有正式版本,也可以指定相應(yīng)版本號。
代碼示例
案例一
看看如下的代碼,是在什么場景下有問題:
var p *P
if someCondition {
p = &P{}
}
print(p.f) // nilness reports NO error here, but NilAway does.在上述代碼中,當(dāng) someCondition 變量值為 true 時,才會初始化結(jié)構(gòu)體 P。如果 someCondition 變量為 false 時,就會出現(xiàn)空指針調(diào)用的 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() {
// 煎魚正在干點(diǎn)什么...
bar() // nilness reports NO error here, but NilAway does.
}函數(shù) foo 返回了一個 nil 指針,該指針在函數(shù) bar 中被直接取消引用,導(dǎo)致每當(dāng)調(diào)用函數(shù) bar 時都會出現(xiàn) panic 問題。
NilAway 工具也能捕獲這類跨函數(shù)的的問題,會報告如下錯誤:
~ 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 內(nèi)跨函數(shù)的問題識別,但實(shí)際上該工具也嫩能夠分析跨 package 的調(diào)用。
總結(jié)
今天針對 Go 里最常見的 nil 指針問題進(jìn)行了靜態(tài)分析工具 NilAway 的分享。雖然目前該工具還沒有正式的生產(chǎn)可用。
可以明確的是這是大家在 Go 應(yīng)用上常碰到的場景,可以多加關(guān)注后續(xù)的更新。另外 NilAway 是基于 go/analysis 標(biāo)準(zhǔn)開發(fā)的,后續(xù)可以接入 golangci-lint 等相關(guān)工具。大家可以繼續(xù)保持關(guān)注!
分享文章:UberGo出了個靜態(tài)分析工具NilAway,還挺實(shí)用!
標(biāo)題網(wǎng)址:http://m.fisionsoft.com.cn/article/djppido.html


咨詢
建站咨詢
