kisielk/errcheck

GitHub: kisielk/errcheck

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

Stars: 2525 | Forks: 146

# errcheck errcheck 用于查找 Go 代码中被静默忽略的 error。 ![errcheck](https://static.pigsec.cn/wp-content/uploads/repos/cas/26/26c431508102863e9da1e814df62dc8627f91494b53118925207e88b584bb1f4.svg) 对于所有不在排除列表中的 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分析, 日志审计