aboutsummaryrefslogtreecommitdiffstats
path: root/tools/syz-linter
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-07-05 09:57:20 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-05 10:55:16 +0200
commit22f8756722ad4bbf532a6861776b24cbb513755e (patch)
treee47ab3053a332bb0002137abc01418e472fefcd3 /tools/syz-linter
parent214e3e269cce39f25d2552d3ba994cced679d5e8 (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.go26
-rw-r--r--tools/syz-linter/testdata/src/lintertest/lintertest.go10
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"
}