diff --git a/.github/workflows/go.yml b/.github/workflows/go.yml index f38bc2e5..e773c21b 100644 --- a/.github/workflows/go.yml +++ b/.github/workflows/go.yml @@ -1,22 +1,23 @@ # This file adheres to the YAML5 style. { name: "Go", - on: ["push", "pull_request"], + on: [ "push", "pull_request" ], jobs: { build: { name: "Build", "runs-on": "ubuntu-latest", + strategy: { matrix: { "go-version": [ "stable", "oldstable"] } }, steps: [ + { name: "Check out code into the Go module directory", uses: "actions/checkout@v4" }, { - name: "Set up Go 1.18", + name: "Set up Go ${{ matrix.go-version }}", uses: "actions/setup-go@v4", - "with": {"go-version": 1.18}, + with: { "go-version": "${{ matrix.go-version }}" }, id: "go", }, - {name: "Check out code into the Go module directory", uses: "actions/checkout@v1"}, - {name: "Linter", run: "make lint"}, - {name: "Test", run: "make test"}, - {name: "Test release", run: "make test-release"}, + { name: "Linter", run: "make lint" }, + { name: "Test", run: "make test" }, + { name: "Test release", run: "make test-release" }, ], }, }, diff --git a/.github/workflows/merge.yml b/.github/workflows/merge.yml index aee7c44b..1bb7a511 100644 --- a/.github/workflows/merge.yml +++ b/.github/workflows/merge.yml @@ -11,7 +11,7 @@ name: "Build", "runs-on": "ubuntu-latest", steps: [ - {name: "Check out code into the Go module directory", uses: "actions/checkout@v1"}, + {name: "Check out code into the Go module directory", uses: "actions/checkout@v4"}, {name: "Test master", run: "make test-master"}, {name: "Test release", run: "make test-release"}, ], diff --git a/.github/workflows/release-management.yml b/.github/workflows/release-management.yml index 79b12044..318bc5c4 100644 --- a/.github/workflows/release-management.yml +++ b/.github/workflows/release-management.yml @@ -11,6 +11,6 @@ jobs: runs-on: ubuntu-latest steps: # Drafts your next Release notes as Pull Requests are merged into "master" - - uses: toolmantim/release-drafter@v5.12.1 + - uses: toolmantim/release-drafter@v6.0.0 env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.golangci.yml b/.golangci.yml index 865cb163..a25ee0d1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -6,36 +6,39 @@ "fast": false, "linters": { "enable": [ - "deadcode", "errcheck", - "gas", + "gosec", "gocritic", "gofmt", "goimports", - "golint", "govet", "gosimple", "ineffassign", - "megacheck", "misspell", "nakedret", "staticcheck", - "structcheck", "typecheck", "unconvert", "unparam", "unused", - "varcheck", ], }, "disable": [ + "deadcode", # deprecated "depguard", "dupl", + "exhaustivestruct", # deprecated "gocyclo", - "interfacer", + "golint", # deprecated + "ifshort", # deprecated + "interfacer", # deprecated "lll", - "maligned", + "maligned", # deprecated + "nosnakecase", # deprecated "prealloc", + "scopelint", # deprecated + "structcheck", # deprecated + "varcheck", # deprecated ], "linters-settings": { "gocritic": { diff --git a/Makefile b/Makefile index 030107f3..3f13b302 100644 --- a/Makefile +++ b/Makefile @@ -32,7 +32,7 @@ test-release: @echo "everything is OK" lint: - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH_DIR)/bin v1.49.0 + curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(GOPATH_DIR)/bin v1.54.0 $(GOPATH_DIR)/bin/golangci-lint run ./... go build -o go-ruleguard ./cmd/ruleguard ./go-ruleguard -debug-imports -rules rules.go ./... diff --git a/_docs/dsl.md b/_docs/dsl.md index fa8c491f..d4a9dc27 100644 --- a/_docs/dsl.md +++ b/_docs/dsl.md @@ -65,7 +65,7 @@ To add such documentation, use special pragmas when commenting a matcher functio //doc:summary reports always false/true conditions //doc:before strings.Count(s, "/") >= 0 //doc:after strings.Count(s, "/") > 0 -//doc:tags diagnostic exprimental +//doc:tags diagnostic experimental func badCond(m dsl.Matcher) { m.Match(`strings.Count($_, $_) >= 0`).Report(`statement always true`) m.Match(`bytes.Count($_, $_) >= 0`).Report(`statement always true`) diff --git a/_docs/rules.go b/_docs/rules.go index 61e58399..8656590c 100644 --- a/_docs/rules.go +++ b/_docs/rules.go @@ -230,7 +230,7 @@ func gocriticBadCall(m dsl.Matcher) { `bytes.Replace($_, $_, $_, 0)`, `strings.SplitN($_, $_, 0)`, `bytes.SplitN($_, $_, 0)`). - Report(`n=0 argument does nothing, maybe n=-1 is indended?`) + Report(`n=0 argument does nothing, maybe n=-1 is intended?`) m.Match(`append($_)`). Report(`append called with 1 argument does nothing`) diff --git a/analyzer/analyzer.go b/analyzer/analyzer.go index 1a3a2a2d..191981d2 100644 --- a/analyzer/analyzer.go +++ b/analyzer/analyzer.go @@ -4,7 +4,6 @@ import ( "bytes" "fmt" "go/token" - "io/ioutil" "os" "path/filepath" "strings" @@ -232,7 +231,7 @@ func newEngine() (*ruleguard.Engine, error) { filenames := strings.Split(flagRules, ",") for _, filename := range filenames { filename = strings.TrimSpace(filename) - data, err := ioutil.ReadFile(filename) + data, err := os.ReadFile(filename) if err != nil { return nil, fmt.Errorf("read rules file: %v", err) } diff --git a/analyzer/analyzer_test.go b/analyzer/analyzer_test.go index e218a341..69c66b5f 100644 --- a/analyzer/analyzer_test.go +++ b/analyzer/analyzer_test.go @@ -5,7 +5,6 @@ import ( "fmt" "go/token" "io/fs" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -180,7 +179,7 @@ var rulesFile = %s } t.Run(test.name, func(t *testing.T) { rulesFilename := filepath.Join(wd, "testdata", "src", test.name, "rules.go") - data, err := ioutil.ReadFile(rulesFilename) + data, err := os.ReadFile(rulesFilename) if err != nil { t.Fatalf("%s: %v", test.name, err) } @@ -205,7 +204,7 @@ var rulesFile = %s } var irfileBuf bytes.Buffer irprint.File(&irfileBuf, irfile) - mainFile, err := ioutil.TempFile("", "ruleguard-test*.go") + mainFile, err := os.CreateTemp("", "ruleguard-test*.go") if err != nil { t.Fatal(err) } diff --git a/analyzer/testdata/src/gocritic/f1.go b/analyzer/testdata/src/gocritic/f1.go index e7ce0c92..6fd234aa 100644 --- a/analyzer/testdata/src/gocritic/f1.go +++ b/analyzer/testdata/src/gocritic/f1.go @@ -60,7 +60,7 @@ func appendCombine2(xs []int, aa []int, bb []int) []int { } func badCall(s string, xs []int) { - _ = strings.Replace(s, "a", "b", 0) // want `\Qn=0 argument does nothing, maybe n=-1 is indended?` + _ = strings.Replace(s, "a", "b", 0) // want `\Qn=0 argument does nothing, maybe n=-1 is intended?` _ = append(xs) // want `\Qappend called with 1 argument does nothing` } diff --git a/analyzer/testdata/src/gocritic/rules.go b/analyzer/testdata/src/gocritic/rules.go index 0d230e89..c6cc7875 100644 --- a/analyzer/testdata/src/gocritic/rules.go +++ b/analyzer/testdata/src/gocritic/rules.go @@ -54,7 +54,7 @@ func testRules(m dsl.Matcher) { Report(`$dst=append($x,$a,$b) is faster`) m.Match(`strings.Replace($_, $_, $_, 0)`). - Report(`n=0 argument does nothing, maybe n=-1 is indended?`) + Report(`n=0 argument does nothing, maybe n=-1 is intended?`) m.Match(`append($_)`). Report(`append called with 1 argument does nothing`) diff --git a/cmd/gorules/main.go b/cmd/gorules/main.go index 689b7df5..1690c3df 100644 --- a/cmd/gorules/main.go +++ b/cmd/gorules/main.go @@ -2,8 +2,6 @@ package main import ( "bytes" - "os" - "encoding/json" "flag" "fmt" @@ -12,8 +10,8 @@ import ( "go/parser" "go/token" "go/types" - "io/ioutil" "log" + "os" "path/filepath" "strings" @@ -86,7 +84,7 @@ func docCommand(args []string) error { filenames := strings.Split(*flagRules, ",") for _, filename := range filenames { filename = strings.TrimSpace(filename) - data, err := ioutil.ReadFile(filename) + data, err := os.ReadFile(filename) if err != nil { return fmt.Errorf("read rules file: %v", err) } @@ -164,7 +162,7 @@ func precompileCommand(args []string) error { fset := token.NewFileSet() filename := strings.TrimSpace(*flagRules) - fileData, err := ioutil.ReadFile(filename) + fileData, err := os.ReadFile(filename) if err != nil { return fmt.Errorf("read %s: %v", filename, err) } diff --git a/dsl/dsl.go b/dsl/dsl.go index d3c73bdd..082fe2b8 100644 --- a/dsl/dsl.go +++ b/dsl/dsl.go @@ -106,7 +106,7 @@ type Var struct { Const bool // ConstSlice reports whether expr matched by var is a slice literal - // consisting of contant elements. + // consisting of constant elements. // // We need a separate Const-like predicate here because Go doesn't // treat slices of const elements as constants, so including diff --git a/go.mod b/go.mod index c5298b0f..f49d0327 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,19 @@ module github.com/quasilyte/go-ruleguard -go 1.17 +go 1.19 require ( github.com/go-toolsmith/astcopy v1.0.2 - github.com/google/go-cmp v0.5.9 + github.com/google/go-cmp v0.6.0 github.com/quasilyte/go-ruleguard/dsl v0.3.22 github.com/quasilyte/go-ruleguard/rules v0.0.0-20211022131956-028d6511ab71 github.com/quasilyte/gogrep v0.5.0 github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 - golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 - golang.org/x/tools v0.7.0 + golang.org/x/exp/typeparams v0.0.0-20240213143201-ec583247a57a + golang.org/x/tools v0.18.0 ) require ( github.com/go-toolsmith/astequal v1.0.3 // indirect - golang.org/x/mod v0.9.0 // indirect - golang.org/x/sys v0.6.0 // indirect + golang.org/x/mod v0.15.0 // indirect ) diff --git a/go.sum b/go.sum index 3a1c54aa..083043be 100644 --- a/go.sum +++ b/go.sum @@ -7,8 +7,8 @@ github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUD github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= @@ -22,63 +22,35 @@ github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4l github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08 h1:VpoGhesgULkabDHoDFGayS1wnkasmT95Jq2xZDwN45Q= -golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 h1:jWGQJV4niP+CCmFW9ekjA9Zx8vYORzOUH2/Nl5WPuLQ= -golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20240213143201-ec583247a57a h1:rrd/FiSCWtI24jk057yBSfEfHrzzjXva1VkDNWRXMag= +golang.org/x/exp/typeparams v0.0.0-20240213143201-ec583247a57a/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/internal/goenv/goenv.go b/internal/goenv/goenv.go index 2f207aa0..52d0f520 100644 --- a/internal/goenv/goenv.go +++ b/internal/goenv/goenv.go @@ -3,46 +3,26 @@ package goenv import ( "errors" "os/exec" - "runtime" - "strconv" "strings" ) func Read() (map[string]string, error) { - out, err := exec.Command("go", "env").CombinedOutput() + // pass in a fixed set of var names to avoid needing to unescape output + // pass in literals here instead of a variable list to avoid security linter warnings about command injection + out, err := exec.Command("go", "env", "GOROOT", "GOPATH", "GOARCH", "GOOS", "CGO_ENABLED").CombinedOutput() if err != nil { return nil, err } - return parseGoEnv(out, runtime.GOOS) + return parseGoEnv([]string{"GOROOT", "GOPATH", "GOARCH", "GOOS", "CGO_ENABLED"}, out) } -func parseGoEnv(data []byte, goos string) (map[string]string, error) { +func parseGoEnv(varNames []string, data []byte) (map[string]string, error) { vars := make(map[string]string) lines := strings.Split(strings.ReplaceAll(string(data), "\r\n", "\n"), "\n") - - if goos == "windows" { - // Line format is: `set $name=$value` - for _, l := range lines { - l = strings.TrimPrefix(l, "set ") - parts := strings.Split(l, "=") - if len(parts) != 2 { - continue - } - vars[parts[0]] = parts[1] - } - } else { - // Line format is: `$name="$value"` - for _, l := range lines { - parts := strings.Split(strings.TrimSpace(l), "=") - if len(parts) != 2 { - continue - } - val, err := strconv.Unquote(parts[1]) - if err != nil { - continue - } - vars[parts[0]] = val + for i, varName := range varNames { + if i < len(lines) && len(lines[i]) > 0 { + vars[varName] = lines[i] } } diff --git a/internal/goenv/goenv_test.go b/internal/goenv/goenv_test.go index 957e7059..259b1a35 100644 --- a/internal/goenv/goenv_test.go +++ b/internal/goenv/goenv_test.go @@ -7,69 +7,83 @@ import ( func TestParse(t *testing.T) { tests := []struct { - goos string lines []string goroot string gopath string + err bool }{ + // handle windows line-endings { - goos: "windows", lines: []string{ - "set GOROOT=C:\\Program Files\\Go\r\n", - "set GOPATH=C:\\Users\\me\\go\r\n", + "C:\\Program Files\\Go\r\n", + "C:\\Users\\me\\go\r\n", }, goroot: "C:\\Program Files\\Go", gopath: "C:\\Users\\me\\go", }, - // Don't do trim on Windows. + // preserve trailing spaces on windows { - goos: "windows", lines: []string{ - "set GOROOT=C:\\Program Files\\Go \r\n", - "set GOPATH=C:\\Users\\me\\go \r\n", + "C:\\Program Files\\Go \r\n", + "C:\\Users\\me\\go \r\n", }, goroot: "C:\\Program Files\\Go ", gopath: "C:\\Users\\me\\go ", }, + // handle linux line-endings { - goos: "linux", lines: []string{ - "GOROOT=\"/usr/local/go\"\n", - "GOPATH=\"/home/me/go\"\n", + "/usr/local/go\n", + "/home/me/go\n", }, goroot: "/usr/local/go", gopath: "/home/me/go", }, - // Trim lines on Linux. + // preserve trailing spaces on linux { - goos: "linux", lines: []string{ - " GOROOT=\"/usr/local/go\" \n", - "GOPATH=\"/home/me/go\" \n", + "/usr/local/go \n", + "/home/me/go \n", }, - goroot: "/usr/local/go", + goroot: "/usr/local/go ", + gopath: "/home/me/go ", + }, + + // handle empty value + { + lines: []string{ + "\n", + "/home/me/go\n", + }, + goroot: "", gopath: "/home/me/go", }, - // Quotes preserve the whitespace. + // handle short output { - goos: "linux", lines: []string{ - " GOROOT=\"/usr/local/go \" \n", - "GOPATH=\"/home/me/go \" \n", + "/usr/local/go", }, - goroot: "/usr/local/go ", - gopath: "/home/me/go ", + goroot: "/usr/local/go", + gopath: "", + }, + + // handle empty output + { + lines: []string{}, + goroot: "", + gopath: "", + err: true, }, } for i, test := range tests { data := []byte(strings.Join(test.lines, "")) - vars, err := parseGoEnv(data, test.goos) - if err != nil { + vars, err := parseGoEnv([]string{"GOROOT", "GOPATH"}, data) + if err != nil != test.err { t.Fatalf("test %d failed: %v", i, err) } if vars["GOROOT"] != test.goroot { diff --git a/ruleguard/engine.go b/ruleguard/engine.go index 88feef92..e4cf954f 100644 --- a/ruleguard/engine.go +++ b/ruleguard/engine.go @@ -8,7 +8,6 @@ import ( "go/token" "go/types" "io" - "io/ioutil" "os" "sort" "strings" @@ -48,7 +47,7 @@ func (e *engine) LoadedGroups() []GoRuleGroup { } func (e *engine) Load(ctx *LoadContext, buildContext *build.Context, filename string, r io.Reader) error { - data, err := ioutil.ReadAll(r) + data, err := io.ReadAll(r) if err != nil { return err } diff --git a/ruleguard/ir/gen_filter_op.go b/ruleguard/ir/gen_filter_op.go index aecb975d..b1c81949 100644 --- a/ruleguard/ir/gen_filter_op.go +++ b/ruleguard/ir/gen_filter_op.go @@ -7,7 +7,7 @@ import ( "bytes" "fmt" "go/format" - "io/ioutil" + "os" "strings" ) @@ -142,7 +142,7 @@ func main() { panic(err) } - if err := ioutil.WriteFile("filter_op.gen.go", pretty, 0644); err != nil { + if err := os.WriteFile("filter_op.gen.go", pretty, 0644); err != nil { panic(err) } } diff --git a/ruleguard/ir_loader.go b/ruleguard/ir_loader.go index d7166891..90dea56a 100644 --- a/ruleguard/ir_loader.go +++ b/ruleguard/ir_loader.go @@ -8,7 +8,7 @@ import ( "go/parser" "go/token" "go/types" - "io/ioutil" + "os" "regexp" "github.com/quasilyte/gogrep" @@ -144,7 +144,7 @@ func (l *irLoader) loadBundle(bundle ir.BundleImport) error { } func (l *irLoader) loadExternFile(prefix, pkgPath, filename string) (*goRuleSet, error) { - src, err := ioutil.ReadFile(filename) + src, err := os.ReadFile(filename) if err != nil { return nil, err } @@ -195,7 +195,7 @@ func (l *irLoader) compileFilterFuncs(filename string, irfile *ir.File) error { if err != nil { // If this ever happens, user will get unexpected error // lines for it; but we should trust that 99.9% errors - // should be catched at irconv phase so we get a valid Go + // should be caught at irconv phase so we get a valid Go // source here as well? return fmt.Errorf("parse custom decls: %w", err) } diff --git a/ruleguard/quasigo/eval_test.go b/ruleguard/quasigo/eval_test.go index 53bdbdc5..717a7dee 100644 --- a/ruleguard/quasigo/eval_test.go +++ b/ruleguard/quasigo/eval_test.go @@ -4,7 +4,6 @@ import ( "bytes" "errors" "fmt" - "io/ioutil" "os" "os/exec" "path/filepath" @@ -88,7 +87,7 @@ func TestEval(t *testing.T) { {`foo.Method1(40)`, "Hello40"}, {`newFoo("x").Method1(11)`, "x11"}, - // Accesing the fields. + // Accessing the fields. {`foo.Prefix`, "Hello"}, // Nil checks. @@ -241,7 +240,7 @@ func TestEval(t *testing.T) { } func TestEvalFile(t *testing.T) { - files, err := ioutil.ReadDir("testdata") + files, err := os.ReadDir("testdata") if err != nil { t.Fatal(err) } diff --git a/ruleguard/quasigo/gen_opcodes.go b/ruleguard/quasigo/gen_opcodes.go index c8d51203..80386df2 100644 --- a/ruleguard/quasigo/gen_opcodes.go +++ b/ruleguard/quasigo/gen_opcodes.go @@ -7,8 +7,8 @@ import ( "bytes" "fmt" "go/format" - "io/ioutil" "log" + "os" "strings" "text/template" ) @@ -186,7 +186,7 @@ func writeFile(filename string, data []byte) { if err != nil { log.Panicf("gofmt: %v", err) } - if err := ioutil.WriteFile(filename, pretty, 0666); err != nil { + if err := os.WriteFile(filename, pretty, 0666); err != nil { log.Panicf("write %s: %v", filename, err) } } diff --git a/ruleguard/ruleguard_test.go b/ruleguard/ruleguard_test.go index eeb15d96..ec3dbf9a 100644 --- a/ruleguard/ruleguard_test.go +++ b/ruleguard/ruleguard_test.go @@ -31,7 +31,7 @@ func TestTruncateText(t *testing.T) { for _, test := range tests { have := string(truncateText([]byte(test.input), test.maxLen)) if len(have) > test.maxLen { - t.Errorf("truncateText(%q, %v): len %d exceeeds max len", + t.Errorf("truncateText(%q, %v): len %d exceeds max len", test.input, test.maxLen, len(have)) } if len(test.input) > test.maxLen && len(have) != test.maxLen { diff --git a/ruleguard/runner.go b/ruleguard/runner.go index c76b6db3..fdc95ab5 100644 --- a/ruleguard/runner.go +++ b/ruleguard/runner.go @@ -8,7 +8,7 @@ import ( "go/build" "go/printer" "go/token" - "io/ioutil" + "os" "path/filepath" "reflect" "sort" @@ -166,7 +166,7 @@ func (rr *rulesRunner) fileBytes() []byte { } // TODO(quasilyte): re-use src slice? - src, err := ioutil.ReadFile(rr.filename) + src, err := os.ReadFile(rr.filename) if err != nil || src == nil { // Assign a zero-length slice so rr.src // is never nil during the second fileBytes call. diff --git a/ruleguard/textmatch/textmatch.go b/ruleguard/textmatch/textmatch.go index a3787e2c..135f9574 100644 --- a/ruleguard/textmatch/textmatch.go +++ b/ruleguard/textmatch/textmatch.go @@ -9,7 +9,7 @@ type Pattern interface { } // Compile parses a regular expression and returns a compiled -// pattern that can match inputs descriped by the regexp. +// pattern that can match inputs described by the regexp. // // Semantically it's close to the regexp.Compile, but // it does recognize some common patterns and creates diff --git a/ruleguard/typematch/typematch_test.go b/ruleguard/typematch/typematch_test.go index 3221c4f3..bb22a51e 100644 --- a/ruleguard/typematch/typematch_test.go +++ b/ruleguard/typematch/typematch_test.go @@ -17,7 +17,7 @@ var ( stringerIface = types.NewInterfaceType([]*types.Func{ types.NewFunc(token.NoPos, nil, "String", - types.NewSignature(nil, types.NewTuple(), types.NewTuple(types.NewVar(token.NoPos, nil, "result", typeString)), false)), + types.NewSignatureType(nil, nil, nil, types.NewTuple(), types.NewTuple(types.NewVar(token.NoPos, nil, "result", typeString)), false)), }, nil) intVar = types.NewVar(token.NoPos, nil, "_", typeInt) @@ -95,30 +95,30 @@ func TestIdentical(t *testing.T) { {`unsafe.Pointer`, typeUnsafePtr}, {`[]unsafe.Pointer`, types.NewSlice(typeUnsafePtr)}, - {`func()`, types.NewSignature(nil, nil, nil, false)}, - {`func(int)`, types.NewSignature(nil, types.NewTuple(intVar), nil, false)}, - {`func(int, string)`, types.NewSignature(nil, types.NewTuple(intVar, stringVar), nil, false)}, - {`func() int`, types.NewSignature(nil, nil, types.NewTuple(intVar), false)}, - {`func(string) int`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, - {`func(int) int`, types.NewSignature(nil, types.NewTuple(intVar), types.NewTuple(intVar), false)}, - {`func() (string, int)`, types.NewSignature(nil, nil, types.NewTuple(stringVar, intVar), false)}, + {`func()`, types.NewSignatureType(nil, nil, nil, nil, nil, false)}, + {`func(int)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), nil, false)}, + {`func(int, string)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar, stringVar), nil, false)}, + {`func() int`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(intVar), false)}, + {`func(string) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, + {`func(int) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), types.NewTuple(intVar), false)}, + {`func() (string, int)`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(stringVar, intVar), false)}, - {`func($_)`, types.NewSignature(nil, types.NewTuple(intVar), nil, false)}, - {`func($_)`, types.NewSignature(nil, types.NewTuple(stringVar), nil, false)}, - {`func($_) int`, types.NewSignature(nil, types.NewTuple(intVar), types.NewTuple(intVar), false)}, - {`func($_) int`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, + {`func($_)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), nil, false)}, + {`func($_)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), nil, false)}, + {`func($_) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), types.NewTuple(intVar), false)}, + {`func($_) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, - {`func($*_) int`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, - {`func($*_) int`, types.NewSignature(nil, nil, types.NewTuple(intVar), false)}, - {`func($*_) $_`, types.NewSignature(nil, nil, types.NewTuple(intVar), false)}, + {`func($*_) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, + {`func($*_) int`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(intVar), false)}, + {`func($*_) $_`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(intVar), false)}, - {`func($t, $t)`, types.NewSignature(nil, types.NewTuple(stringVar, stringVar), nil, false)}, - {`func($t, $t)`, types.NewSignature(nil, types.NewTuple(intVar, intVar), nil, false)}, + {`func($t, $t)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar, stringVar), nil, false)}, + {`func($t, $t)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar, intVar), nil, false)}, // Any func. - {`func($*_) $*_`, types.NewSignature(nil, nil, nil, false)}, - {`func($*_) $*_`, types.NewSignature(nil, types.NewTuple(stringVar, stringVar), nil, false)}, - {`func($*_) $*_`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, + {`func($*_) $*_`, types.NewSignatureType(nil, nil, nil, nil, nil, false)}, + {`func($*_) $*_`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar, stringVar), nil, false)}, + {`func($*_) $*_`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, {`struct{}`, typeEstruct}, {`struct{int}`, types.NewStruct([]*types.Var{intVar}, nil)}, @@ -203,21 +203,21 @@ func TestIdenticalNegative(t *testing.T) { {`syntax.Regexp`, namedType2("regexp2/syntax", "Regexp")}, {`syntax.Regexp`, namedType2("regexp2/syntax", "Blah")}, - {`func(int)`, types.NewSignature(nil, nil, nil, false)}, - {`func() int`, types.NewSignature(nil, types.NewTuple(intVar), nil, false)}, - {`func(int, int)`, types.NewSignature(nil, types.NewTuple(intVar, stringVar), nil, false)}, - {`func() string`, types.NewSignature(nil, nil, types.NewTuple(intVar), false)}, - {`func(string, string) int`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, - {`func(string) string`, types.NewSignature(nil, nil, types.NewTuple(stringVar, intVar), false)}, + {`func(int)`, types.NewSignatureType(nil, nil, nil, nil, nil, false)}, + {`func() int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), nil, false)}, + {`func(int, int)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar, stringVar), nil, false)}, + {`func() string`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(intVar), false)}, + {`func(string, string) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(intVar), false)}, + {`func(string) string`, types.NewSignatureType(nil, nil, nil, nil, types.NewTuple(stringVar, intVar), false)}, - {`func($_) int`, types.NewSignature(nil, types.NewTuple(intVar), types.NewTuple(stringVar), false)}, + {`func($_) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar), types.NewTuple(stringVar), false)}, - {`func($t, $t)`, types.NewSignature(nil, types.NewTuple(intVar, stringVar), nil, false)}, - {`func($t, $t)`, types.NewSignature(nil, types.NewTuple(stringVar, intVar), nil, false)}, + {`func($t, $t)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(intVar, stringVar), nil, false)}, + {`func($t, $t)`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar, intVar), nil, false)}, - {`func($*_) int`, types.NewSignature(nil, types.NewTuple(stringVar), types.NewTuple(stringVar), false)}, - {`func($*_) int`, types.NewSignature(nil, nil, nil, false)}, - {`func($*_) $_`, types.NewSignature(nil, nil, nil, false)}, + {`func($*_) int`, types.NewSignatureType(nil, nil, nil, types.NewTuple(stringVar), types.NewTuple(stringVar), false)}, + {`func($*_) int`, types.NewSignatureType(nil, nil, nil, nil, nil, false)}, + {`func($*_) $_`, types.NewSignatureType(nil, nil, nil, nil, nil, false)}, // Any func negative. {`func($*_) $*_`, typeInt}, @@ -256,7 +256,7 @@ func TestIdenticalNegative(t *testing.T) { // TODO: this should fail as $* is named. // We don't support named $* now, but they should be supported. - //{`struct{$*x; int; $*x}`, structType(stringVar, intVar, intVar)}, + // {`struct{$*x; int; $*x}`, structType(stringVar, intVar, intVar)}, } state := NewMatcherState() diff --git a/ruleguard/utils.go b/ruleguard/utils.go index d3226db2..6403d91c 100644 --- a/ruleguard/utils.go +++ b/ruleguard/utils.go @@ -273,7 +273,7 @@ func isTypeExpr(info *types.Info, x ast.Expr) bool { case *ast.Ident: // Identifier may be a type expression if object - // it reffers to is a type name. + // it refers to is a type name. _, ok := info.ObjectOf(x).(*types.TypeName) return ok diff --git a/rules/go.mod b/rules/go.mod index b8301c00..fd3e7f8e 100644 --- a/rules/go.mod +++ b/rules/go.mod @@ -3,7 +3,7 @@ module github.com/quasilyte/go-ruleguard/rules go 1.15 require ( - github.com/quasilyte/go-ruleguard v0.3.19 + github.com/quasilyte/go-ruleguard v0.3.20 github.com/quasilyte/go-ruleguard/dsl v0.3.22 - golang.org/x/tools v0.7.0 + golang.org/x/tools v0.18.0 ) diff --git a/rules/go.sum b/rules/go.sum index 933f11c8..f505fcc1 100644 --- a/rules/go.sum +++ b/rules/go.sum @@ -10,8 +10,8 @@ github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/quasilyte/go-ruleguard v0.3.1-0.20210203134552-1b5a410e1cc8/go.mod h1:KsAh3x0e7Fkpgs+Q9pNLS5XpFSvYCEVl5gP9Pp1xp30= -github.com/quasilyte/go-ruleguard v0.3.19 h1:tfMnabXle/HzOb5Xe9CUZYWXKfkS1KwRmZyPmD9nVcc= -github.com/quasilyte/go-ruleguard v0.3.19/go.mod h1:lHSn69Scl48I7Gt9cX3VrbsZYvYiBYszZOZW4A+oTEw= +github.com/quasilyte/go-ruleguard v0.3.20 h1:1ZbKzc8cvHYL+fRb8Qr8JBDjMpV/RLG98Hjd2MXkhOg= +github.com/quasilyte/go-ruleguard v0.3.20/go.mod h1:dUrYRDrW547I0Y6sSAYMKhj+6XvujC0MhQEB15eLJSo= github.com/quasilyte/go-ruleguard/dsl v0.3.0/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= github.com/quasilyte/go-ruleguard/dsl v0.3.22 h1:wd8zkOhSNr+I+8Qeciml08ivDt1pSXe60+5DqOpCjPE= github.com/quasilyte/go-ruleguard/dsl v0.3.22/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= @@ -28,14 +28,18 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.11.0/go.mod h1:xgJhtzW8F9jGdVFWZESrid1U1bjeNy4zgy5cRr/CIio= +golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= -golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08 h1:VpoGhesgULkabDHoDFGayS1wnkasmT95Jq2xZDwN45Q= -golang.org/x/exp/typeparams v0.0.0-20221002003631-540bb7301a08/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833 h1:jWGQJV4niP+CCmFW9ekjA9Zx8vYORzOUH2/Nl5WPuLQ= +golang.org/x/exp/typeparams v0.0.0-20230307190834-24139beb5833/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.9.0 h1:KENHtAZL2y3NLMYZeHY9DW8HW8V+kQyJsY/V9JlKvCs= -golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.15.0 h1:SernR4v+D55NyBH2QiEQrlBAnj1ECL6AGrA5+dPaMY8= +golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= @@ -43,13 +47,18 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.12.0/go.mod h1:zEVYFnQC7m/vmpQFELhcD1EWkZlX69l4oqgmer6hfKA= +golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -59,25 +68,36 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0 h1:MVltZSvRTcU2ljQOhs94SXPftV6DCNnZViHeQps87pQ= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808/go.mod h1:KG1lNk5ZFNssSZLrpVb4sMXKMpGwGXOxSG3rnu2gZQQ= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.10.0/go.mod h1:lpqdcUyK/oCiQxvxVrppt5ggO2KCZ5QblwqPnfZ6d5o= +golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200812195022-5ae4c3c160a0/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20201230224404-63754364767c/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= -golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= +golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= +golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= +golang.org/x/tools v0.18.0 h1:k8NLag8AGHnn+PHbl7g43CtqZAwG60vZkLqgyZgIHgQ= +golang.org/x/tools v0.18.0/go.mod h1:GL7B4CwcLLeo59yx/9UWWuNOW1n3VZ4f5axWfML7Lcg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=