Test of warning diagnostics from various analyzers:
copylocks, printf, slog, tests, timeformat, nilness, and cgocall.
-- settings.json --
{
"pullDiagnostics": true
}
-- go.mod --
module example.com
go 1.12
-- flags --
-min_go=go1.21
-cgo
-- bad_test.go --
package analyzer
import (
"fmt"
"log/slog"
"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")
}
// slog
func _() {
slog.Info("msg", 1) //@diag("1", re`slog.Info arg "1" should be a string or a slog.Attr`)
}
-- cgocall/cgocall.go --
package cgocall
// Note: this test must be in a separate package, as the unsafe import
// silences the unusedwrite 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")
}