CodeQL 文档

对 recover 的冗余调用

ID: go/redundant-recover
Kind: problem
Security severity: 
Severity: warning
Precision: high
Tags:
   - maintainability
   - correctness
Query suites:
   - go-security-and-quality.qls

点击查看 CodeQL 代码库中的查询

内置的 recover 函数仅在延迟函数内部有用。在从未延迟的函数中调用它意味着它将始终返回 nil,并且它永远不会重新获得对 panic goroutine 的控制。直接在 defer 语句中调用 recover 也是如此。

建议

仔细检查代码,以确定它是否是应该修复的错误。

示例

在下面的示例中,函数 fun1 旨在从 panic 中恢复。但是,延迟的函数调用另一个函数,该函数然后调用 recover

package main

import "fmt"

func callRecover1() {
	if recover() != nil {
		fmt.Printf("recovered")
	}
}

func fun1() {
	defer func() {
		callRecover1()
	}()
	panic("1")
}

可以通过延迟对调用 recover 的函数的调用来解决此问题

package main

import "fmt"

func callRecover1Good() {
	if recover() != nil {
		fmt.Printf("recovered")
	}
}

func fun1Good() {
	defer callRecover1Good()
	panic("1")
}

在以下示例中,recover 直接在 defer 语句中调用,这没有任何效果,因此不会捕获 panic。

package main

func fun2() {
	defer recover()
	panic("2")
}

我们可以通过延迟调用 recover 的匿名函数来解决此问题。

package main

func fun2Good() {
	defer func() { recover() }()
	panic("2")
}

参考文献

  • ©GitHub 公司
  • 条款
  • 隐私