kisielk/errcheck
GitHub: kisielk/errcheck
errcheck 是一款 Go 静态分析工具,用于检测代码中被静默忽略的 error 返回值,帮助开发者避免因遗漏错误处理而引发的潜在缺陷。
Stars: 2525 | Forks: 146
# errcheck
errcheck 用于查找 Go 代码中被静默忽略的 error。

对于所有不在排除列表中的 callable,所有返回的 error 都必须
要么赋值给一个变量,要么通过赋值给 `_` 来显式丢弃。
请注意,errcheck 不会对已赋值的 error 进行任何进一步的分析。
例如,它不会对以下情况发出警告:
```
err := foo()
// First error is discarded
err = bar()
if err != nil {
...
}
```
如需此类分析及更多功能,请参阅 [staticcheck](https://staticcheck.dev/)。
## 安装
```
go install github.com/kisielk/errcheck@latest
```
errcheck 需要 Go 1.25 或更高版本。
## 使用
对于基本用法,只需将感兴趣的 package 路径作为第一个参数传入:
```
errcheck github.com/kisielk/errcheck/testdata
```
检查当前目录下的所有 package:
```
errcheck ./...
```
或者检查你的 `$GOPATH` 和 `$GOROOT` 中的所有 package:
```
errcheck all
```
errcheck 还支持以下命令行选项:
`-tags` 标志接收一个以空格分隔的 build tags 列表,就像 `go
build` 一样。如果你在代码库中使用了任何自定义的 build tags,你可能需要
在此处指定相关的 tags。
`-asserts` 标志启用对被忽略的类型断言结果的检查。它
不接收任何参数。
`-blank` 标志启用对将 error 赋值给
blank identifier 的检查。它不接收任何参数。
`-abspath` 标志打印未检查 error 的文件的绝对路径。
`-mod` 标志设置要使用的模块下载模式:`readonly` 或 `vendor`。
### go/analysis
该 package 提供了 `Analyzer` 实例,可与
[go/analysis](https://pkg.go.dev/golang.org/x/tools/go/analysis) API 一起使用。
目前支持的标志有 `blank`、`assert`、`exclude` 和 `excludeonly`。
与 API 本身一样,该 analyzer 是实验性的,未来可能会发生变化。
## 排除函数
使用 `-exclude` 标志指定一个文件路径,该文件包含要
排除的函数列表。
```
errcheck -exclude errcheck_excludes.txt path/to/package
```
该文件每行应包含一个函数签名。函数签名的格式为
`package.FunctionName`,而对于方法,值接收者的格式为 `(package.Receiver).MethodName`
指针接收者的格式为 `(*package.Receiver).MethodName`。如果函数名后面跟着 `(TYPE)` 形式的字符串,那么
只有当第一个参数的类型为 `TYPE` 时,该函数调用才会被排除。它还接受特殊的后缀
`(os.Stdout)` 和 `(os.Stderr)`,这仅在第一个参数是字面量 `os.Stdout` 或 `os.Stderr` 时排除该函数。
以下是一个排除文件的示例:
```
io.Copy(*bytes.Buffer)
io.Copy(os.Stdout)
os.ReadFile
// Sometimes we don't care if a HTTP request fails.
(*net/http.Client).Do
```
默认情况下,排除列表会与一个内部列表结合使用,该内部列表包含 Go 标准库中那些具有 error 返回类型但文档说明永远不会返回 error 的函数。要禁用内置的排除列表,请传入 `-excludeonly` 标志。
在 `-verbose` 模式下运行 errcheck 以查看添加的最终排除列表。
当使用 vendored 依赖时,请指定完整的 import 路径。例如:
* 你项目的 import 路径为 `example.com/yourpkg`
* 你将 `example.net/fmt2` 作为 `vendor/example.net/fmt2` 进行了 vendored
* 你希望将 `fmt2.Println` 从 error 检查中排除
在这种情况下,请将此行添加到你的排除文件中:
```
example.com/yourpkg/vendor/example.net/fmt2.Println
```
空行和以 `//` 开头的行将被忽略。
### 已弃用的方法
`-ignore` 标志接收一个以逗号分隔的 package:regex 键值对列表。
对于每个 package,regex 描述了在该 package 内要忽略哪些函数。
可以省略 package,以使 regex 应用于所有 package。
例如,你可能希望忽略诸如 Read 和 Write 之类的常见操作:
```
errcheck -ignore '[rR]ead|[wW]rite' path/to/package
```
或者你可能希望忽略常见的函数,比如 `fmt` 中的 `print` 变体:
```
errcheck -ignore 'fmt:[FS]?[Pp]rint*' path/to/package
```
`-ignorepkg` 标志接收一个以逗号分隔的 package import 路径
列表以进行忽略:
```
errcheck -ignorepkg 'fmt,encoding/binary' path/to/package
```
请注意,这等同于:
```
errcheck -ignore 'fmt:.*,encoding/binary:.*' path/to/package
```
如果通过 `-ignore` 为 package `pkg` 提供了 regex,并且 `pkg` 也出现在
传递给 `-ignorepkg` 的 package 列表中,则后者优先;
也就是说,`pkg` 内的所有函数都将被忽略。
请注意,默认情况下 `fmt` package 会被完全忽略,除非
为它指定了 regex。要禁用此功能,请指定一个匹配不到任何内容的 regex:
```
errcheck -ignore 'fmt:a^' path/to/package
```
`-ignoretests` 标志禁用对 `_test.go` 文件的检查。它不接收
任何参数。
`-ignoregenerated` 标志禁用对生成的源代码的检查。它不接收任何参数。
## 退出码
如果在检查的文件中发现了任何问题,errcheck 将返回 1。
如果发生任何其他失败,它将返回 2。
# 编辑器集成
## Emacs
[go-errcheck.el](https://github.com/dominikh/go-errcheck.el)
通过提供 `go-errcheck` 命令和可自定义变量来自动向 errcheck 传递标志,从而将 errcheck 与 Emacs 集成。
## Vim
[vim-go](https://github.com/fatih/vim-go) 可以通过其 `:GoErrCheck`
和 `:GoMetaLinter` 命令来运行 errcheck。
标签:EVTX分析, 日志审计