Go Uber靜態(tài)分析工具NilAway使用初體驗(yàn)
Uber 開源的靜態(tài)分析工具 NilAway
今天給大家介紹以下 Uber 開源的靜態(tài)分析工具 NilAway,下面開魯。
最近 Uber 開發(fā)和開源了一個(gè)挺不錯(cuò)的靜態(tài)分析工具 NilAway:
NilAway是一個(gè)靜態(tài)分析工具,旨在通過在編譯時(shí)而不是運(yùn)行時(shí)捕獲nil panic來幫助開發(fā)人員避免在生產(chǎn)中出現(xiàn)這種情況。NilAway類似于標(biāo)準(zhǔn)的nilness分析器,但它采用更復(fù)雜和強(qiáng)大的靜態(tài)分析技術(shù)來跟蹤包內(nèi)和跨包的nil流,并報(bào)告錯(cuò)誤,為用戶提供更輕松的調(diào)試nilness流程。
NilAway關(guān)鍵特性
NilAway具有三個(gè)關(guān)鍵特性,使其脫穎而出:
完全自動(dòng)化:NilAway配備有推理引擎,因此除了標(biāo)準(zhǔn)的Go代碼之外,它不需要從開發(fā)人員那里獲取任何其他信息(例如注釋)。
速度快:我們?cè)O(shè)計(jì)NilAway為快速且可擴(kuò)展,適用于大型代碼庫。在我們的測(cè)量中,啟用NilAway時(shí)構(gòu)建時(shí)間開銷不到5%。我們還在不斷應(yīng)用優(yōu)化來進(jìn)一步減少其占用空間。
實(shí)用性:它不能阻止代碼中所有可能的nil panic,但它可以捕獲我們?cè)谏a(chǎn)中觀察到的大多數(shù)潛在nil panic,使NilAway在實(shí)用性和構(gòu)建時(shí)間開銷之間保持良好平衡。
安裝
NilAway是使用標(biāo)準(zhǔn)的go/analysis框架實(shí)現(xiàn)的,因此易于與現(xiàn)有的分析驅(qū)動(dòng)程序集成(例如golangci-lint、nogo或作為獨(dú)立檢查器運(yùn)行)。下面是將NilAway作為獨(dú)立檢查器運(yùn)行的說明。更多集成支持將很快添加。
獨(dú)立檢查器
通過以下命令從源代碼安裝二進(jìn)制文件:
go install go.uber.org/nilaway/cmd/nilaway@latest
然后,通過以下命令運(yùn)行l(wèi)inter:
nilaway ./...
案例一 NilAway如何幫助防止nil panic
讓我們看一些示例,了解NilAway如何幫助防止nil panic。
// Example 1: var p *P if someCondition { p = &P{} } print(p.f) // nilness reports NO error here, but NilAway does.
在這個(gè)示例中,局部變量p
僅在someCondition
為true時(shí)初始化。在字段訪問p.f
時(shí),如果someCondition
為false,則可能發(fā)生panic。NilAway能夠捕獲這個(gè)潛在的nil導(dǎo)致的panic并報(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`
如果我們使用nil檢查(if p != nil
)保護(hù)此解引用,錯(cuò)誤將消失。
案例二 NilAway還能夠捕獲跨函數(shù)的nil流
例如,考慮以下代碼片段:
// Example 2: func foo() *int { return nil } func bar() { print(*foo()) // nilness reports NO error here, but NilAway does. }
在這個(gè)示例中,函數(shù)foo
返回一個(gè)nil指針,在bar
中直接解引用,無論何時(shí)調(diào)用bar
都會(huì)導(dǎo)致panic。NilAway能夠捕獲這個(gè)潛在的nil導(dǎo)致的panic并報(bào)告以下錯(cuò)誤:
go.uber.org/example.go:23:13: error: Potential nil panic detected. Observed nil flow from source to dereference point: -> go.uber.org/example.go:20:14: literal `nil` returned from `foo()` in position 0 -> go.uber.org/example.go:23:13: result 0 of `foo()` dereferenced
請(qǐng)注意,在上面的示例中,foo
不一定要與bar
位于同一個(gè)包中。NilAway還能夠跟蹤跨包的nil流。此外,NilAway處理Go特定的語言構(gòu)造,如接收器、接口、類型斷言、類型開關(guān)等。
總結(jié)
今天針對(duì) Go 里最常見的 nil 指針問題進(jìn)行了靜態(tài)分析工具 NilAway 的分享。雖然目前該工具還沒有正式的生產(chǎn)可用。
以上就是Go Uber靜態(tài)分析工具NilAway使用初體驗(yàn)的詳細(xì)內(nèi)容,更多關(guān)于Go Uber靜態(tài)分析NilAway的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例
這篇文章主要介紹了Go語言實(shí)現(xiàn)登錄驗(yàn)證代碼案例,代碼和圖文講解的很清晰,有感興趣的可以學(xué)習(xí)下2021-03-03在Go中動(dòng)態(tài)替換SQL查詢中的日期參數(shù)的完整步驟
在處理數(shù)據(jù)庫查詢時(shí),經(jīng)常需要根據(jù)不同的輸入條件動(dòng)態(tài)地構(gòu)造SQL語句,尤其是在涉及日期范圍的查詢中,能夠根據(jù)實(shí)際需求調(diào)整查詢的起始和結(jié)束日期顯得尤為重要,在本文中,我將介紹如何在Go語言中實(shí)現(xiàn)動(dòng)態(tài)替換SQL查詢中的日期參數(shù),需要的朋友可以參考下2024-11-11