* Drop the iso_checksum_type & iso_checksum_url fields In favor of simply using iso_checksum that will know what to do. * fix after master merge * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * remove checksum lowercasing tests * Update builder_test.go * Update builder_test.go * better docs * Update builder_test.go * even better docs * Update config.go * Update builder_test.go * Update step_create_vmx_test.go * make generate * better docs * fix imports * up tests * Update _ISOConfig-required.html.md * Update builder_test.go * don't use sha1.Sum("none") as a caching path * Update builder_test.go * better docs * Update iso_config_test.go remove ISOChecksumType/ISOChecksumURL references * Update step_download_test.go * add iso_checksum_url and iso_checksum_type fixers + tests * add concrete examples of checksum values * add examples of checksumming from local file * update go-getter dep * up deps * use new go-getter version * up ESX5Driver.VerifyChecksum: use go-getter's checksumming * ISOConfig.Prepare: get checksum there in case we need it as a string in ESX5Driver.VerifyChecksum * Update iso_config.go * get go-getter from v2 branch * Update driver_esx5.go add more comments * Update driver_esx5.go * show better error message when the checksum is invalid * Update builder_test.go put in a valid checksum to fix tests, checksum is md5("packer") * Update builder_test.go test invalid and valid checksum * more test updating * fix default md5 string to be a valid md5 * TestChecksumFileNameMixedCaseBug: use 'file:' prefix for file checksumming * Update iso_config_test.go * Update iso_config_test.go * Update builder_test.go * Update builder_test.go * Update builder_test.go * Update CHANGELOG.md * Update CHANGELOG.md * Update go.mod * Update go.mod * Update CHANGELOG.md
72 lines
1.9 KiB
Go
72 lines
1.9 KiB
Go
package sharedcheck
|
|
|
|
import (
|
|
"go/ast"
|
|
"go/types"
|
|
|
|
"golang.org/x/tools/go/analysis"
|
|
"honnef.co/go/tools/code"
|
|
"honnef.co/go/tools/internal/passes/buildir"
|
|
"honnef.co/go/tools/ir"
|
|
. "honnef.co/go/tools/lint/lintdsl"
|
|
)
|
|
|
|
func CheckRangeStringRunes(pass *analysis.Pass) (interface{}, error) {
|
|
for _, fn := range pass.ResultOf[buildir.Analyzer].(*buildir.IR).SrcFuncs {
|
|
cb := func(node ast.Node) bool {
|
|
rng, ok := node.(*ast.RangeStmt)
|
|
if !ok || !code.IsBlank(rng.Key) {
|
|
return true
|
|
}
|
|
|
|
v, _ := fn.ValueForExpr(rng.X)
|
|
|
|
// Check that we're converting from string to []rune
|
|
val, _ := v.(*ir.Convert)
|
|
if val == nil {
|
|
return true
|
|
}
|
|
Tsrc, ok := val.X.Type().(*types.Basic)
|
|
if !ok || Tsrc.Kind() != types.String {
|
|
return true
|
|
}
|
|
Tdst, ok := val.Type().(*types.Slice)
|
|
if !ok {
|
|
return true
|
|
}
|
|
TdstElem, ok := Tdst.Elem().(*types.Basic)
|
|
if !ok || TdstElem.Kind() != types.Int32 {
|
|
return true
|
|
}
|
|
|
|
// Check that the result of the conversion is only used to
|
|
// range over
|
|
refs := val.Referrers()
|
|
if refs == nil {
|
|
return true
|
|
}
|
|
|
|
// Expect two refs: one for obtaining the length of the slice,
|
|
// one for accessing the elements
|
|
if len(code.FilterDebug(*refs)) != 2 {
|
|
// TODO(dh): right now, we check that only one place
|
|
// refers to our slice. This will miss cases such as
|
|
// ranging over the slice twice. Ideally, we'd ensure that
|
|
// the slice is only used for ranging over (without
|
|
// accessing the key), but that is harder to do because in
|
|
// IR form, ranging over a slice looks like an ordinary
|
|
// loop with index increments and slice accesses. We'd
|
|
// have to look at the associated AST node to check that
|
|
// it's a range statement.
|
|
return true
|
|
}
|
|
|
|
pass.Reportf(rng.Pos(), "should range over string, not []rune(string)")
|
|
|
|
return true
|
|
}
|
|
Inspect(fn.Source(), cb)
|
|
}
|
|
return nil, nil
|
|
}
|