diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2020-07-05 09:57:20 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2020-07-05 10:55:16 +0200 |
| commit | 22f8756722ad4bbf532a6861776b24cbb513755e (patch) | |
| tree | e47ab3053a332bb0002137abc01418e472fefcd3 /tools/syz-linter | |
| parent | 214e3e269cce39f25d2552d3ba994cced679d5e8 (diff) | |
tools/syz-linter: check log/error text ending with dot
Update #1876
Diffstat (limited to 'tools/syz-linter')
| -rw-r--r-- | tools/syz-linter/linter.go | 26 | ||||
| -rw-r--r-- | tools/syz-linter/testdata/src/lintertest/lintertest.go | 10 |
2 files changed, 26 insertions, 10 deletions
diff --git a/tools/syz-linter/linter.go b/tools/syz-linter/linter.go index 5d09debda..0b2a9f2b9 100644 --- a/tools/syz-linter/linter.go +++ b/tools/syz-linter/linter.go @@ -171,6 +171,7 @@ func reportFuncArgs(pass *analysis.Pass, fields []*ast.Field, first, last int) { }) } +// checkLogErrorFormat warns about log/error messages starting with capital letter or ending with dot. func checkLogErrorFormat(pass *analysis.Pass, n *ast.CallExpr) { fun, ok := n.Fun.(*ast.SelectorExpr) if !ok { @@ -190,14 +191,27 @@ func checkLogErrorFormat(pass *analysis.Pass, n *ast.CallExpr) { return } val := lit.Value[1 : len(lit.Value)-1] // the value includes quotes - if len(val) < 2 || !unicode.IsUpper(rune(val[0])) || !unicode.IsLower(rune(val[1])) || - publicIdentifier.MatchString(val) { + ln := len(val) + if ln == 0 { + pass.Report(analysis.Diagnostic{ + Pos: n.Pos(), + Message: "Don't use empty log/error messages", + }) return } - pass.Report(analysis.Diagnostic{ - Pos: n.Pos(), - Message: "bad log/error", - }) + if val[ln-1] == '.' && (ln < 3 || val[ln-2] != '.' || val[ln-3] != '.') { + pass.Report(analysis.Diagnostic{ + Pos: n.Pos(), + Message: "Don't use dot at the end of log/error messages", + }) + } + if ln >= 2 && unicode.IsUpper(rune(val[0])) && unicode.IsLower(rune(val[1])) && + !publicIdentifier.MatchString(val) { + pass.Report(analysis.Diagnostic{ + Pos: n.Pos(), + Message: "Don't start log/error messages with a Capital letter", + }) + } } var publicIdentifier = regexp.MustCompile(`^[A-Z][[:alnum:]]+(\.[[:alnum:]]+)+ `) diff --git a/tools/syz-linter/testdata/src/lintertest/lintertest.go b/tools/syz-linter/testdata/src/lintertest/lintertest.go index c44f61683..b36333797 100644 --- a/tools/syz-linter/testdata/src/lintertest/lintertest.go +++ b/tools/syz-linter/testdata/src/lintertest/lintertest.go @@ -58,8 +58,10 @@ func logErrorMessages() { log.Print("Using.An.Identifier is ok as well") log.Print(msg) - fmt.Errorf("Bad message") // want "bad log/error" - log.Fatalf("Bad message %v", 1) // want "bad log/error" - log.Printf("Bad message %v", 1) // want "bad log/error" - log.Print("Bad message") // want "bad log/error" + fmt.Errorf("Bad message") // want "Don't start log/error messages with a Capital letter" + log.Fatalf("Bad message %v", 1) // want "Don't start log/error messages with a Capital letter" + log.Printf("Bad message %v", 1) // want "Don't start log/error messages with a Capital letter" + log.Print("Bad message") // want "Don't start log/error messages with a Capital letter" + log.Print("also ad message.") // want "Don't use dot at the end of log/error messages" + log.Print("") // want "Don't use empty log/error messages" } |
