From dc523c8ddf5b0ce985ea90c65cbaa097c9e3ee09 Mon Sep 17 00:00:00 2001 From: cui fliter Date: Fri, 26 May 2023 12:02:54 +0800 Subject: [PATCH] cmd: add a new analyzer for check missing values after append If there is no second parameter added during append, there will be no prompt when executing go vet. Add an analyzer to detect this situation Update #60448 Change-Id: If9848835424f310c54e3e9377aaaad4a1516871a Reviewed-on: https://go-review.googlesource.com/c/go/+/498416 Run-TryBot: shuang cui Run-TryBot: Tim King LUCI-TryBot-Result: Go LUCI TryBot-Result: Gopher Robot Reviewed-by: Michael Matloob Reviewed-by: Tim King Reviewed-by: Alan Donovan --- src/cmd/go/internal/test/flagdefs.go | 1 + .../go/analysis/passes/appends/appends.go | 49 +++++++++++++++++++ .../x/tools/go/analysis/passes/appends/doc.go | 20 ++++++++ src/cmd/vendor/modules.txt | 1 + src/cmd/vet/main.go | 2 + src/cmd/vet/testdata/appends/appends.go | 12 +++++ src/cmd/vet/vet_test.go | 1 + 7 files changed, 86 insertions(+) create mode 100644 src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/appends.go create mode 100644 src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/doc.go create mode 100644 src/cmd/vet/testdata/appends/appends.go diff --git a/src/cmd/go/internal/test/flagdefs.go b/src/cmd/go/internal/test/flagdefs.go index 12d506862dde9..baa0cdf4c64d4 100644 --- a/src/cmd/go/internal/test/flagdefs.go +++ b/src/cmd/go/internal/test/flagdefs.go @@ -40,6 +40,7 @@ var passFlagToTest = map[string]bool{ } var passAnalyzersToVet = map[string]bool{ + "appends": true, "asmdecl": true, "assign": true, "atomic": true, diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/appends.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/appends.go new file mode 100644 index 0000000000000..f0b90a4920e71 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/appends.go @@ -0,0 +1,49 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package appends defines an Analyzer that detects +// if there is only one variable in append. +package appends + +import ( + _ "embed" + "go/ast" + "go/types" + + "golang.org/x/tools/go/analysis" + "golang.org/x/tools/go/analysis/passes/inspect" + "golang.org/x/tools/go/analysis/passes/internal/analysisutil" + "golang.org/x/tools/go/ast/inspector" +) + +//go:embed doc.go +var doc string + +var Analyzer = &analysis.Analyzer{ + Name: "appends", + Doc: analysisutil.MustExtractDoc(doc, "appends"), + URL: "https://pkg.go.dev/golang.org/x/tools/go/analysis/passes/appends", + Requires: []*analysis.Analyzer{inspect.Analyzer}, + Run: run, +} + +func run(pass *analysis.Pass) (interface{}, error) { + inspect := pass.ResultOf[inspect.Analyzer].(*inspector.Inspector) + + nodeFilter := []ast.Node{ + (*ast.CallExpr)(nil), + } + inspect.Preorder(nodeFilter, func(n ast.Node) { + call := n.(*ast.CallExpr) + if ident, ok := call.Fun.(*ast.Ident); ok && ident.Name == "append" { + if _, ok := pass.TypesInfo.Uses[ident].(*types.Builtin); ok { + if len(call.Args) == 1 { + pass.ReportRangef(call, "append with no values") + } + } + } + }) + + return nil, nil +} diff --git a/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/doc.go b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/doc.go new file mode 100644 index 0000000000000..2e6a2e010bae6 --- /dev/null +++ b/src/cmd/vendor/golang.org/x/tools/go/analysis/passes/appends/doc.go @@ -0,0 +1,20 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// Package appends defines an Analyzer that detects +// if there is only one variable in append. +// +// # Analyzer appends +// +// appends: check for missing values after append +// +// This checker reports calls to append that pass +// no values to be appended to the slice. +// +// s := []string{"a", "b", "c"} +// _ = append(s) +// +// Such calls are always no-ops and often indicate an +// underlying mistake. +package appends diff --git a/src/cmd/vendor/modules.txt b/src/cmd/vendor/modules.txt index a2b1e248be8f5..74f9d488f10cd 100644 --- a/src/cmd/vendor/modules.txt +++ b/src/cmd/vendor/modules.txt @@ -52,6 +52,7 @@ golang.org/x/tools/cmd/bisect golang.org/x/tools/cover golang.org/x/tools/go/analysis golang.org/x/tools/go/analysis/internal/analysisflags +golang.org/x/tools/go/analysis/passes/appends golang.org/x/tools/go/analysis/passes/asmdecl golang.org/x/tools/go/analysis/passes/assign golang.org/x/tools/go/analysis/passes/atomic diff --git a/src/cmd/vet/main.go b/src/cmd/vet/main.go index 2290b95033c2a..c5197284b5616 100644 --- a/src/cmd/vet/main.go +++ b/src/cmd/vet/main.go @@ -9,6 +9,7 @@ import ( "golang.org/x/tools/go/analysis/unitchecker" + "golang.org/x/tools/go/analysis/passes/appends" "golang.org/x/tools/go/analysis/passes/asmdecl" "golang.org/x/tools/go/analysis/passes/assign" "golang.org/x/tools/go/analysis/passes/atomic" @@ -46,6 +47,7 @@ func main() { objabi.AddVersionFlag() unitchecker.Main( + appends.Analyzer, asmdecl.Analyzer, assign.Analyzer, atomic.Analyzer, diff --git a/src/cmd/vet/testdata/appends/appends.go b/src/cmd/vet/testdata/appends/appends.go new file mode 100644 index 0000000000000..09ef3d2a33a51 --- /dev/null +++ b/src/cmd/vet/testdata/appends/appends.go @@ -0,0 +1,12 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This file contains tests for the appends checker. + +package appends + +func AppendsTest() { + sli := []string{"a", "b", "c"} + sli = append(sli) // ERROR "append with no values" +} diff --git a/src/cmd/vet/vet_test.go b/src/cmd/vet/vet_test.go index 8b29907e818c9..4bb0de00b3b2b 100644 --- a/src/cmd/vet/vet_test.go +++ b/src/cmd/vet/vet_test.go @@ -62,6 +62,7 @@ func vetCmd(t *testing.T, arg, pkg string) *exec.Cmd { func TestVet(t *testing.T) { t.Parallel() for _, pkg := range []string{ + "appends", "asm", "assign", "atomic",