sa1007.go raw

   1  package sa1007
   2  
   3  import (
   4  	"fmt"
   5  	"go/constant"
   6  	"net/url"
   7  
   8  	"honnef.co/go/tools/analysis/callcheck"
   9  	"honnef.co/go/tools/analysis/lint"
  10  	"honnef.co/go/tools/internal/passes/buildir"
  11  	"honnef.co/go/tools/knowledge"
  12  
  13  	"golang.org/x/tools/go/analysis"
  14  )
  15  
  16  var SCAnalyzer = lint.InitializeAnalyzer(&lint.Analyzer{
  17  	Analyzer: &analysis.Analyzer{
  18  		Name:     "SA1007",
  19  		Requires: []*analysis.Analyzer{buildir.Analyzer},
  20  		Run:      callcheck.Analyzer(rules),
  21  	},
  22  	Doc: &lint.RawDocumentation{
  23  		Title:    `Invalid URL in \'net/url.Parse\'`,
  24  		Since:    "2017.1",
  25  		Severity: lint.SeverityError,
  26  		MergeIf:  lint.MergeIfAny,
  27  	},
  28  })
  29  
  30  var Analyzer = SCAnalyzer.Analyzer
  31  
  32  var rules = map[string]callcheck.Check{
  33  	"net/url.Parse": func(call *callcheck.Call) {
  34  		arg := call.Args[knowledge.Arg("net/url.Parse.rawurl")]
  35  		if c := callcheck.ExtractConstExpectKind(arg.Value, constant.String); c != nil {
  36  			s := constant.StringVal(c.Value)
  37  			_, err := url.Parse(s)
  38  			if err != nil {
  39  				arg.Invalid(fmt.Sprintf("%q is not a valid URL: %s", s, err))
  40  			}
  41  		}
  42  	},
  43  }
  44