From 0ae50f7eb96064c024cd9c37ea078dfe66e20dfb Mon Sep 17 00:00:00 2001 From: Fernandez Ludovic Date: Fri, 26 Feb 2021 21:42:59 +0100 Subject: [PATCH] Add nilerr linter. --- go.mod | 1 + go.sum | 3 +++ pkg/golinters/nilerr.go | 18 ++++++++++++++++++ pkg/lint/lintersdb/manager.go | 4 ++++ test/testdata/nilerr.go | 35 +++++++++++++++++++++++++++++++++++ 5 files changed, 61 insertions(+) create mode 100644 pkg/golinters/nilerr.go create mode 100644 test/testdata/nilerr.go diff --git a/go.mod b/go.mod index 0034d9b6587b..bd5617980b15 100644 --- a/go.mod +++ b/go.mod @@ -31,6 +31,7 @@ require ( github.com/golangci/revgrep v0.0.0-20210208091834-cd28932614b5 github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 github.com/gordonklaus/ineffassign v0.0.0-20210225214923-2e10b2664254 + github.com/gostaticanalysis/nilerr v0.1.1 github.com/jgautheron/goconst v1.4.0 github.com/jingyugao/rowserrcheck v0.0.0-20210130005344-c6a0c12dd98d github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3 diff --git a/go.sum b/go.sum index dbc7aa21e84b..77edad8a5074 100644 --- a/go.sum +++ b/go.sum @@ -179,6 +179,8 @@ github.com/gostaticanalysis/analysisutil v0.4.1/go.mod h1:18U/DLpRgIUd459wGxVHE0 github.com/gostaticanalysis/comment v1.3.0/go.mod h1:xMicKDx7XRXYdVwY9f9wQpDJVnqWxw9wCauCMKp+IBI= github.com/gostaticanalysis/comment v1.4.1 h1:xHopR5L2lRz6OsjH4R2HG5wRhW9ySl3FsHIvi5pcXwc= github.com/gostaticanalysis/comment v1.4.1/go.mod h1:ih6ZxzTHLdadaiSnF5WY3dxUoXfXAlTaRzuaNDlSado= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= +github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= @@ -591,6 +593,7 @@ golang.org/x/tools v0.0.0-20200831203904-5a2aa26beb65/go.mod h1:Cj7w3i3Rnn0Xh82u golang.org/x/tools v0.0.0-20201001104356-43ebab892c4c/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201002184944-ecd9fd270d5d/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= golang.org/x/tools v0.0.0-20201011145850-ed2f50202694/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= +golang.org/x/tools v0.0.0-20201023174141-c8cfbd0f21e6/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201028025901-8cd080b735b3/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201114224030-61ea331ec02b/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20201118003311-bd56c0adb394/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/pkg/golinters/nilerr.go b/pkg/golinters/nilerr.go new file mode 100644 index 000000000000..d8a9a613eff4 --- /dev/null +++ b/pkg/golinters/nilerr.go @@ -0,0 +1,18 @@ +package golinters + +import ( + "github.com/gostaticanalysis/nilerr" + "golang.org/x/tools/go/analysis" + + "github.com/golangci/golangci-lint/pkg/golinters/goanalysis" +) + +func NewNilErr() *goanalysis.Linter { + a := nilerr.Analyzer + return goanalysis.NewLinter( + a.Name, + "Finds the code that returns nil even if it checks that the error is not nil.", + []*analysis.Analyzer{a}, + nil, + ).WithLoadMode(goanalysis.LoadModeTypesInfo) +} diff --git a/pkg/lint/lintersdb/manager.go b/pkg/lint/lintersdb/manager.go index 8881bc46f579..55c850565149 100644 --- a/pkg/lint/lintersdb/manager.go +++ b/pkg/lint/lintersdb/manager.go @@ -386,6 +386,10 @@ func (m Manager) GetAllSupportedLinterConfigs() []*linter.Config { WithPresets(linter.PresetStyle). WithLoadForGoAnalysis(). WithURL("https://github.com/julz/importas"), + linter.NewConfig(golinters.NewNilErr()). + WithLoadForGoAnalysis(). + WithPresets(linter.PresetBugs). + WithURL("https://github.com/gostaticanalysis/nilerr"), // nolintlint must be last because it looks at the results of all the previous linters for unused nolint directives linter.NewConfig(golinters.NewNoLintLint()). diff --git a/test/testdata/nilerr.go b/test/testdata/nilerr.go new file mode 100644 index 000000000000..6475f663faa2 --- /dev/null +++ b/test/testdata/nilerr.go @@ -0,0 +1,35 @@ +//args: -Enilerr +package testdata + +import "os" + +func nilErr1() error { + err := nilErrDo() + if err == nil { + return err // ERROR `error is nil \(line 7\) but it returns error` + } + + return nil +} + +func nilErr2() error { + err := nilErrDo() + if err == nil { + return err // ERROR `error is nil \(line 16\) but it returns error` + } + + return nil +} + +func nilErr3() error { + err := nilErrDo() + if err != nil { + return nil // ERROR `error is not nil \(line 25\) but it returns nil` + } + + return nil +} + +func nilErrDo() error { + return os.ErrNotExist +}