src

Go monorepo.
git clone git://code.dwrz.net/src
Log | Files | Refs

sa1007.go (1052B)


      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 }