| Test of warning diagnostics from various analyzers: |
| copylocks, printf, slog, tests, timeformat, nilness, and cgocall. |
| |
| -- go.mod -- |
| module example.com |
| go 1.12 |
| |
| -- flags -- |
| -min_go=go1.21 |
| -cgo |
| |
| -- bad_test.go -- |
| package analyzer |
| |
| import ( |
| "fmt" |
| "sync" |
| "testing" |
| "time" |
| ) |
| |
| // copylocks |
| func _() { |
| var x sync.Mutex |
| _ = x //@diag("x", re"assignment copies lock value to _: sync.Mutex") |
| } |
| |
| // printf |
| func _() { |
| printfWrapper("%s") //@diag(re`printfWrapper\(.*?\)`, re"example.com.printfWrapper format %s reads arg #1, but call has 0 args") |
| } |
| |
| func printfWrapper(format string, args ...interface{}) { |
| fmt.Printf(format, args...) |
| } |
| |
| // tests |
| func Testbad(t *testing.T) { //@diag("Testbad", re"Testbad has malformed name: first letter after 'Test' must not be lowercase") |
| } |
| |
| // timeformat |
| func _() { |
| now := time.Now() |
| fmt.Println(now.Format("2006-02-01")) //@diag("2006-02-01", re"2006-02-01 should be 2006-01-02") |
| } |
| |
| // nilness |
| func _(ptr *int) { |
| if ptr == nil { |
| _ = *ptr //@diag("*ptr", re"nil dereference in load") |
| } |
| } |
| |
| // unusedwrite |
| func _(s struct{x int}) { |
| s.x = 1 //@diag("x", re"unused write to field x") |
| } |
| |
| -- cgocall.go -- |
| package analyzer |
| |
| import "unsafe" |
| |
| // void f(void *ptr) {} |
| import "C" |
| |
| // cgocall |
| func _(c chan bool) { |
| C.f(unsafe.Pointer(&c)) //@ diag("unsafe", re"passing Go type with embedded pointer to C") |
| } |
| |
| -- bad_test_go121.go -- |
| //go:build go1.21 |
| |
| package analyzer |
| |
| import "log/slog" |
| |
| // slog |
| func _() { |
| slog.Info("msg", 1) //@diag("1", re`slog.Info arg "1" should be a string or a slog.Attr`) |
| } |