Go Uber静态分析工具NilAway使用初体验

 更新时间:2024年01月11日 11:24:31   作者:程序员大兵  
这篇文章主要介绍了Go Uber静态分析工具NilAway使用详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

Uber 开源的静态分析工具 NilAway

今天给大家介绍以下 Uber 开源的静态分析工具 NilAway,下面开鲁。

最近 Uber 开发和开源了一个挺不错的静态分析工具 NilAway:

NilAway是一个静态分析工具,旨在通过在编译时而不是运行时捕获nil panic来帮助开发人员避免在生产中出现这种情况。NilAway类似于标准的nilness分析器,但它采用更复杂和强大的静态分析技术来跟踪包内和跨包的nil流,并报告错误,为用户提供更轻松的调试nilness流程。

NilAway关键特性

NilAway具有三个关键特性,使其脱颖而出:

完全自动化:NilAway配备有推理引擎,因此除了标准的Go代码之外,它不需要从开发人员那里获取任何其他信息(例如注释)。

速度快:我们设计NilAway为快速且可扩展,适用于大型代码库。在我们的测量中,启用NilAway时构建时间开销不到5%。我们还在不断应用优化来进一步减少其占用空间。

实用性:它不能阻止代码中所有可能的nil panic,但它可以捕获我们在生产中观察到的大多数潜在nil panic,使NilAway在实用性和构建时间开销之间保持良好平衡。

安装

NilAway是使用标准的go/analysis框架实现的,因此易于与现有的分析驱动程序集成(例如golangci-lint、nogo或作为独立检查器运行)。下面是将NilAway作为独立检查器运行的说明。更多集成支持将很快添加。

独立检查器

通过以下命令从源代码安装二进制文件:

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

然后,通过以下命令运行linter:

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.

在这个示例中,局部变量p仅在someCondition为true时初始化。在字段访问p.f时,如果someCondition为false,则可能发生panic。NilAway能够捕获这个潜在的nil导致的panic并报告以下错误:

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)保护此解引用,错误将消失。

案例二 NilAway还能够捕获跨函数的nil流

例如,考虑以下代码片段:

// Example 2:
func foo() *int {
      return nil
}
func bar() {
     print(*foo()) // nilness reports NO error here, but NilAway does.
}

在这个示例中,函数foo返回一个nil指针,在bar中直接解引用,无论何时调用bar都会导致panic。NilAway能够捕获这个潜在的nil导致的panic并报告以下错误:

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

请注意,在上面的示例中,foo不一定要与bar位于同一个包中。NilAway还能够跟踪跨包的nil流。此外,NilAway处理Go特定的语言构造,如接收器、接口、类型断言、类型开关等。

总结

今天针对 Go 里最常见的 nil 指针问题进行了静态分析工具 NilAway 的分享。虽然目前该工具还没有正式的生产可用。

以上就是Go Uber静态分析工具NilAway使用初体验的详细内容,更多关于Go Uber静态分析NilAway的资料请关注脚本之家其它相关文章!

相关文章

  • 一文详解Go语言中Mutex互斥锁

    一文详解Go语言中Mutex互斥锁

    Golang中的Mutex互斥锁是一种常用的并发控制机制,用于保护共享资源的访问,在本文中,我们将深入探讨Mutex互斥锁的原理、日常使用、锁结构以及运行机制,需要的朋友可以参考下
    2023-12-12
  • Go进行接口组合的解决方案

    Go进行接口组合的解决方案

    在 Go 语言中,接口组合是一种强大的特性,它允许将多个接口组合成一个新的接口,从而提供更灵活和可扩展的代码设计,本文给大家介绍了Go如何进行接口组合,需要的朋友可以参考下
    2024-06-06
  • go使用支付宝沙箱实现支付宝支付的操作步骤

    go使用支付宝沙箱实现支付宝支付的操作步骤

    支付宝沙箱支付是支付宝提供的一个测试环境,用于开发者在不影响真实交易的情况下进行支付接口的开发和调试,本文给大家介绍了go使用支付宝沙箱实现支付宝支付的操作步骤,文中有详细的代码示例和图文供大家参考,需要的朋友可以参考下
    2024-03-03
  • 深入了解Go语言中的作用域和变量重声明

    深入了解Go语言中的作用域和变量重声明

    在 Go 语言中,代码块的嵌套和作用域是程序设计的关键概念之一,本文将探讨如何在 Go 语言中利用代码块的嵌套和作用域来组织代码,并介绍变量重声明的规则,感兴趣的可以了解下
    2023-11-11
  • go:垃圾回收GC触发条件详解

    go:垃圾回收GC触发条件详解

    这篇文章主要介绍了go:垃圾回收GC触发条件详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04
  • 详解Go中处理时间数据的方法

    详解Go中处理时间数据的方法

    在许多场合,你将不得不编写必须处理时间的代码。在Go中处理时间数据需要你从Go标准库中导入 time 包。这个包有很多方法和类型供你使用,但我选取了最常用的方法和类型,并在这篇文章中进行了描述,感兴趣的可以了解一下
    2023-04-04
  • golang封装一个执行命令行的函数(return stderr/stdout/exitcode)示例代码

    golang封装一个执行命令行的函数(return stderr/stdout/exitcode)示例代码

    在 Go 语言中,您可以使用 os/exec 包来执行外部命令,不通过调用 shell,并且能够获得进程的退出码、标准输出和标准错误输出,下面给大家分享golang封装一个执行命令行的函数(return stderr/stdout/exitcode)的方法,感兴趣的朋友跟随小编一起看看吧
    2024-06-06
  • go并发实现素数筛的代码

    go并发实现素数筛的代码

    这篇文章主要介绍了go并发实现素数筛的代码,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • 详解go-zero是如何做路由管理的

    详解go-zero是如何做路由管理的

    go-zero 是一个微服务框架,包含了 web 和 rpc 两大部分,而对于 web 框架来说,路由管理是必不可少的一部分,那么本文就来探讨一下 go-zero 的路由管理是怎么做的吧
    2023-08-08
  • Go缓冲channel和非缓冲channel的区别说明

    Go缓冲channel和非缓冲channel的区别说明

    这篇文章主要介绍了Go缓冲channel和非缓冲channel的区别说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论