sa1011.go raw

   1  package sa1011
   2  
   3  import (
   4  	"go/constant"
   5  	"unicode/utf8"
   6  
   7  	"honnef.co/go/tools/analysis/callcheck"
   8  	"honnef.co/go/tools/analysis/lint"
   9  	"honnef.co/go/tools/internal/passes/buildir"
  10  
  11  	"golang.org/x/tools/go/analysis"
  12  )
  13  
  14  var SCAnalyzer = lint.InitializeAnalyzer(&lint.Analyzer{
  15  	Analyzer: &analysis.Analyzer{
  16  		Name:     "SA1011",
  17  		Requires: []*analysis.Analyzer{buildir.Analyzer},
  18  		Run:      callcheck.Analyzer(checkUTF8CutsetRules),
  19  	},
  20  	Doc: &lint.RawDocumentation{
  21  		Title:    `Various methods in the \"strings\" package expect valid UTF-8, but invalid input is provided`,
  22  		Since:    "2017.1",
  23  		Severity: lint.SeverityError,
  24  		MergeIf:  lint.MergeIfAny,
  25  	},
  26  })
  27  
  28  var Analyzer = SCAnalyzer.Analyzer
  29  
  30  var checkUTF8CutsetRules = map[string]callcheck.Check{
  31  	"strings.IndexAny":     check,
  32  	"strings.LastIndexAny": check,
  33  	"strings.ContainsAny":  check,
  34  	"strings.Trim":         check,
  35  	"strings.TrimLeft":     check,
  36  	"strings.TrimRight":    check,
  37  }
  38  
  39  func check(call *callcheck.Call) {
  40  	arg := call.Args[1]
  41  	if c := callcheck.ExtractConstExpectKind(arg.Value, constant.String); c != nil {
  42  		s := constant.StringVal(c.Value)
  43  		if !utf8.ValidString(s) {
  44  			arg.Invalid("argument is not a valid UTF-8 encoded string")
  45  		}
  46  	}
  47  }
  48