我有一个“零指针”错误,编译器无法找到,但我想看看是否有一种方法可以通过静态分析来找到它。
所以错误是这样的:
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
}
}
运行它时出现错误,因为valueA
是nil
。
panic: runtime error: invalid memory address or nil pointer dereference
这是一个常见的错误,但是编译器找不到。我想知道是否有任何工具可以静态分析代码并将其找出来。
我认为规则可能是这样的:
如果函数调用返回一个值和一个错误,则if err != nil
逻辑不应触摸该返回值(在此示例中为valueA
),因为这很危险,很可能是{{ 1}}。
有没有工具可以做到这一点?
答案 0 :(得分:1)
如果newBadA返回错误,则说valueA即使为nil也不能使用,这是不正确的。 Go会在nil接收器上愉快地调用该函数-例如:
func (a *A) greet() string {
if a == nil {
return "(nil)"
}
return a.name
}