是否可以捕获此nil指针错误

时间:2019-09-07 14:18:40

标签: go

我有一个“零指针”错误,编译器无法找到,但我想看看是否有一种方法可以通过静态分析来找到它。

所以错误是这样的:

package main

import (
    "fmt"
)

type A struct {
    name string
}

func newGoodA() (*A, error) {
    return &A{
        name: "Go",
    }, nil
}

func newBadA() (*A, error) {
    return nil, fmt.Errorf("failed to create A")
}

func (a *A) greet() string {
    return "Hello " + a.name
}

func main() {
    valueA, err := newBadA()
    if err != nil {
        fmt.Printf("Oops, failed because: %v", valueA.greet()) // This should be forbidden, because when err is not nil, valueA shouldn't be touched
    }
}

运行它时出现错误,因为valueAnil

panic: runtime error: invalid memory address or nil pointer dereference

这是一个常见的错误,但是编译器找不到。我想知道是否有任何工具可以静态分析代码并将其找出来。

我认为规则可能是这样的:

如果函数调用返回一个值和一个错误,则if err != nil逻辑不应触摸该返回值(在此示例中为valueA),因为这很危险,很可能是{{ 1}}。

有没有工具可以做到这一点?

1 个答案:

答案 0 :(得分:1)

如果newBadA返回错误,则说valueA即使为nil也不能使用,这是不正确的。 Go会在nil接收器上愉快地调用该函数-例如:

func (a *A) greet() string {
   if a == nil {
      return "(nil)"
   }
   return a.name
}