golang检查未处理错误的静态分析插件errcheck的使用

Golang检查未处理错误的静态分析插件errcheck的使用

errcheck是一个用于发现Go代码中静默忽略错误的工具。它会检查所有不在排除列表中的可调用函数,确保所有返回的错误要么被赋值给变量,要么明确地通过赋值给_来丢弃。

安装

errcheck需要Go 1.22或更高版本。安装命令如下:

go install github.com/kisielk/errcheck@latest

基本使用

要检查特定包的错误处理情况:

errcheck github.com/kisielk/errcheck/testdata

检查当前目录下所有包:

errcheck ./...

检查所有$GOPATH$GOROOT中的包:

errcheck all

示例代码

下面是一个示例代码,展示errcheck如何工作:

package main

import "os"

func main() {
    // 未处理的错误 - errcheck会报告
    os.Open("file.txt")
    
    // 正确处理错误 - errcheck不会报告
    f, err := os.Open("file.txt")
    if err != nil {
        panic(err)
    }
    defer f.Close()
    
    // 明确忽略错误 - errcheck不会报告
    _ = os.Remove("tempfile.txt")
}

常用选项

errcheck支持以下命令行选项:

  • -tags:指定构建标签,与go build相同
  • -asserts:检查忽略的类型断言结果
  • -blank:检查赋值给空白标识符的错误
  • -abspath:打印包含未检查错误的文件的绝对路径
  • -mod:设置模块下载模式:readonlyvendor

排除函数

使用-exclude标志指定包含要排除的函数列表的文件:

errcheck -exclude errcheck_excludes.txt path/to/package

排除文件示例:

io.Copy(*bytes.Buffer)
io.Copy(os.Stdout)
os.ReadFile

// 有时我们不关心HTTP请求是否失败
(*net/http.Client).Do

编辑器集成

errcheck可以与多种编辑器集成:

  • Emacsgo-errcheck.el提供了go-errcheck命令
  • Vimvim-go通过:GoErrCheck:GoMetaLinter命令支持errcheck

退出代码

  • 1:发现任何问题
  • 2:发生其他故障

errcheck是一个简单但强大的工具,可以帮助开发者发现可能被忽略的错误处理情况,提高代码的健壮性。


更多关于golang检查未处理错误的静态分析插件errcheck的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang检查未处理错误的静态分析插件errcheck的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 静态错误检查工具 errcheck 使用指南

errcheck 是一个用于检查 Go 代码中未处理错误的静态分析工具。它可以帮助开发者发现那些被忽略的错误返回值,从而提高代码的健壮性。

安装 errcheck

go install github.com/kisielk/errcheck@latest

基本使用方法

检查整个项目

errcheck ./...

检查单个包

errcheck github.com/yourname/yourpackage

检查单个文件

errcheck yourfile.go

常用选项

  • -blank:检查是否忽略了空白标识符赋值的错误(如 _ = func()
  • -asserts:检查类型断言是否忽略了错误(如 _ = x.(T)
  • -ignore:指定要忽略检查的函数(支持正则表达式)
  • -ignoretests:忽略测试文件中的错误检查

示例配置

可以在项目根目录创建 .errcheck 文件来配置检查规则:

{
  "ignore": {
    "fmt": ["Print.*", "Fprint.*", "Sprint.*"],
    "io/ioutil": ["WriteFile"]
  },
  "asserts": true,
  "blank": true
}

实际应用示例

假设有以下 Go 代码:

package main

import (
	"fmt"
	"os"
)

func main() {
	f, _ := os.Open("file.txt") // 这里忽略了错误
	fmt.Println(f.Name())
}

运行 errcheck 会报告:

main.go:8:14: f, _ := os.Open("file.txt")

与 go vet 集成

可以将 errcheck 作为 go vet 的插件使用:

go vet -vettool=$(which errcheck) ./...

在 CI/CD 中集成

可以在项目的 CI 流程中添加 errcheck 检查,例如在 GitHub Actions 中:

name: Go Checks
on: [push, pull_request]
jobs:
  errcheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-go@v2
        with:
          go-version: '1.20'
      - run: go install github.com/kisielk/errcheck@latest
      - run: errcheck ./...

忽略特定错误

如果确实需要忽略某些错误,可以使用空白标识符并添加注释:

// errcheck:ignore
f, _ := os.Open("file.txt") // 明确忽略此错误

或者使用 errcheck 的 -ignore 选项忽略特定函数:

errcheck -ignore 'Close|Write' ./...

最佳实践

  1. 在开发过程中定期运行 errcheck
  2. 将 errcheck 集成到 CI/CD 流程中
  3. 对于确实需要忽略的错误,明确注释原因
  4. 优先处理错误而不是忽略它们

errcheck 是一个简单但强大的工具,可以帮助开发者避免常见的错误处理疏忽,提高代码质量。

回到顶部