开发者

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

目录
  • Uber 开源的静态分析工具 NilAway
    • NilAway关键特性
  • 安装
    • 独立检查器
      • 案例一 NilAway如何帮助防止nil panic
      • 案例二 NilAway还能够捕获跨函数的nil流
    • 总结

      Uber 开源的静态分析工具 NilAway

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

      最近 Uber 开发和开源了一个挺不错的静态分析工具 Nil编程客栈Away:

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

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

      NilAway关键特性

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

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

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

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

      安装

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

      独立检查器

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

      go install go.uandroidber.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静态分析工具NilAwphpay使用初体验的详细内容,更多关于Go Uber静态分析NilAway的资料请关注编程客栈(www.devze.com)其它相关文章!

      0

      上一篇:

      下一篇:

      精彩评论

      暂无评论...
      验证码 换一张
      取 消

      最新开发

      开发排行榜