大家好,我是煎鱼。
我们拥有10余年网页设计和网站建设经验,从网站策划到网站制作,我们的网页设计师为您提供的解决方案。为企业提供成都网站制作、网站设计、微信开发、微信小程序开发、手机网站制作设计、html5、等业务。无论您有什么样的网站设计或者设计方案要求,我们都将富于创造性的提供专业设计服务并满足您的需求。
风水轮流转,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 *P
if 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 等相关工具。大家可以继续保持关注!
网站栏目:UberGo出了个静态分析工具NilAway,还挺实用!
地址分享:http://www.shufengxianlan.com/qtweb/news41/44541.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联