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