自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Uber Go 出了個(gè)靜態(tài)分析工具 NilAway,還挺實(shí)用!

開(kāi)發(fā) 開(kāi)發(fā)工具
今天針對(duì) Go 里最常見(jiàn)的 nil 指針問(wèn)題進(jìn)行了靜態(tài)分析工具 NilAway 的分享。雖然目前該工具還沒(méi)有正式的生產(chǎn)可用。

大家好,我是煎魚(yú)。

風(fēng)水輪流轉(zhuǎn),Go 程序?qū)懚嗔恕?偸菚?huì)這有點(diǎn)問(wèn)題,那有點(diǎn)問(wèn)題。問(wèn)題積累久了就容易出點(diǎn)事件,甚至是事故。

這種時(shí)候大家往往會(huì)想著引入一些靜態(tài)分析工具來(lái)解決這個(gè)問(wèn)題。元旦假期時(shí)剛好看到這個(gè)新輪子,分享給大家!

NilAway 分析工具

最近 Uber 開(kāi)發(fā)和開(kāi)源了一個(gè)挺不錯(cuò)的靜態(tài)分析工具 NilAway:

圖片圖片

使用場(chǎng)景是:在 Go 程序編譯時(shí)就能捕獲 nil,達(dá)到幫助開(kāi)發(fā)人員規(guī)避在生產(chǎn)中出現(xiàn) nil panic 的問(wèn)題。

官方認(rèn)為其具備以下三個(gè)重要的特點(diǎn),讓其脫穎而出:

  1. 完全自動(dòng)化:該分析工具只需要用戶提供標(biāo)準(zhǔn)的 Go 代碼就可以使用了。不需要其他任何額外的信息。
  2. 速度快:在設(shè)計(jì)上,NilAway 保持速度快且可擴(kuò)展,目標(biāo)是大型代碼庫(kù)也可以使用。在官方的性能測(cè)量中,啟用 NilAway 時(shí)構(gòu)建時(shí)間開(kāi)銷(xiāo)不到 5%。
  3. 很實(shí)用:它不能防止代碼中所有可能的 nil panic,但能捕獲我們?cè)谏a(chǎn)中觀察到的大部分潛在 nil panic,從而使 NilAway 在實(shí)用性和構(gòu)建時(shí)間開(kāi)銷(xiāo)之間保持良好的平衡。

安裝

我們只需要在命令行執(zhí)行如下命令安裝:

$ go install go.uber.org/nilaway/cmd/nilaway@latest

nilaway 能夠遍歷掃描目錄下的所有文件:

$ nilaway ./...

也可以掃描單獨(dú)的文件:

$ nilaway demo.go

注:本文安裝 @latest 的原因,是因?yàn)閷?xiě)此文時(shí) nilaway 還在積極開(kāi)發(fā)階段,暫時(shí)沒(méi)有發(fā)布正式的版本。如果后續(xù)有正式版本,也可以指定相應(yīng)版本號(hào)。

代碼示例

案例一

看看如下的代碼,是在什么場(chǎng)景下有問(wèn)題:

var p *P
if someCondition {
      p = &P{}
}
print(p.f) // nilness reports NO error here, but NilAway does.

在上述代碼中,當(dāng) someCondition 變量值為 true 時(shí),才會(huì)初始化結(jié)構(gòu)體 P。如果 someCondition 變量為 false 時(shí),就會(huì)出現(xiàn)空指針調(diào)用的 panic 問(wèn)題。

NilAway 工具可以捕獲這種錯(cuò)誤并報(bào)告,會(huì)報(bào)告如下錯(cuò)誤:

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`

如果我們?cè)黾?nbsp;if p != nil 來(lái)做防御,報(bào)告的錯(cuò)誤就會(huì)消失。

案例二

看看如下的代碼,是為什么有問(wèn)題:

func foo() *int {
 return nil
}
func bar() {
 print(*foo())
}

func main() {
 // 煎魚(yú)正在干點(diǎn)什么...
 bar() // nilness reports NO error here, but NilAway does.
}

函數(shù) foo 返回了一個(gè) nil 指針,該指針在函數(shù) bar 中被直接取消引用,導(dǎo)致每當(dāng)調(diào)用函數(shù) bar 時(shí)都會(huì)出現(xiàn) panic 問(wèn)題。

NilAway 工具也能捕獲這類(lèi)跨函數(shù)的的問(wèn)題,會(huì)報(bào)告如下錯(cuò)誤:

?  ~ 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ù)的問(wèn)題識(shí)別,但實(shí)際上該工具也嫩能夠分析跨 package 的調(diào)用。

總結(jié)

今天針對(duì) Go 里最常見(jiàn)的 nil 指針問(wèn)題進(jìn)行了靜態(tài)分析工具 NilAway 的分享。雖然目前該工具還沒(méi)有正式的生產(chǎn)可用。

可以明確的是這是大家在 Go 應(yīng)用上常碰到的場(chǎng)景,可以多加關(guān)注后續(xù)的更新。另外 NilAway 是基于 go/analysis 標(biāo)準(zhǔn)開(kāi)發(fā)的,后續(xù)可以接入 golangci-lint 等相關(guān)工具。大家可以繼續(xù)保持關(guān)注!

責(zé)任編輯:武曉燕 來(lái)源: 腦子進(jìn)煎魚(yú)了
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)