Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

cmd/vet: Detect global variables := assignments #24867

Closed
gertcuykens opened this issue Apr 15, 2018 · 3 comments
Closed

cmd/vet: Detect global variables := assignments #24867

gertcuykens opened this issue Apr 15, 2018 · 3 comments

Comments

@gertcuykens
Copy link
Contributor

gertcuykens commented Apr 15, 2018

var mux *http.ServeMux

func init() {
	mux := http.NewServeMux()
	mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "TLS: %+v", r.TLS)
	})
}

func TestACME(t *testing.T) {
	m := &autocert.Manager{
		Cache:      autocert.DirCache("tls"),
		Prompt:     autocert.AcceptTOS,
		HostPolicy: autocert.HostWhitelist("example.com"),
	}
	go http.ListenAndServe(":http", m.HTTPHandler(nil))
	s := &http.Server{
		Addr:      ":https",
		TLSConfig: &tls.Config{GetCertificate: m.GetCertificate},
		Handler:   mux,
	}
	t.Fatal(s.ListenAndServeTLS("", ""))
}

go test -v
Then visit the website

2018/04/15 04:49:57 http2: panic serving ...:62672: runtime error: invalid memory address or nil pointer dereference
goroutine 16 [running]:
net/http.(*http2serverConn).runHandler.func1(0xc42000e0a8, 0xc42003cfaf, 0xc42019e380)
	/usr/lib/go/src/net/http/h2_bundle.go:5753 +0x192
panic(0x7f7ffea9a9c0, 0x7f7ffec35a90)
	/usr/lib/go/src/runtime/panic.go:502 +0x22d
net/http.(*ServeMux).shouldRedirect(0x0, 0xc420015fb0, 0xd, 0x7f7ffe7c3bcc, 0x1, 0x7f7ffe6f868d)
	/usr/lib/go/src/net/http/server.go:2239 +0xf3
net/http.(*ServeMux).redirectToPathSlash(0x0, 0xc420015fb0, 0xd, 0x7f7ffe7c3bcc, 0x1, 0xc420102700, 0xff3, 0xc42007f720)
	/usr/lib/go/src/net/http/server.go:2224 +0x59
net/http.(*ServeMux).Handler(0x0, 0xc4201b6200, 0xc42019adc0, 0xc420030d01, 0xc420030da8, 0x7f7ffe6fd0c8)
	/usr/lib/go/src/net/http/server.go:2293 +0x11a
net/http.(*ServeMux).ServeHTTP(0x0, 0x7f7ffeb00dc0, 0xc42000e0a8, 0xc4201b6200)
	/usr/lib/go/src/net/http/server.go:2336 +0x100
net/http.serverHandler.ServeHTTP(0xc420071040, 0x7f7ffeb00dc0, 0xc42000e0a8, 0xc4201b6200)
	/usr/lib/go/src/net/http/server.go:2694 +0xbe
net/http.initNPNRequest.ServeHTTP(0xc42007f500, 0xc420071040, 0x7f7ffeb00dc0, 0xc42000e0a8, 0xc4201b6200)
	/usr/lib/go/src/net/http/server.go:3260 +0x9c
net/http.(Handler).ServeHTTP-fm(0x7f7ffeb00dc0, 0xc42000e0a8, 0xc4201b6200)
	/usr/lib/go/src/net/http/h2_bundle.go:5475 +0x4f
net/http.(*http2serverConn).runHandler(0xc42019e380, 0xc42000e0a8, 0xc4201b6200, 0xc42019ae80)
	/usr/lib/go/src/net/http/h2_bundle.go:5760 +0x8b
created by net/http.(*http2serverConn).processHeaders
	/usr/lib/go/src/net/http/h2_bundle.go:5494 +0x46d
2018/04/15 04:49:57 http2: panic serving ...:62672: runtime error: invalid memory address or nil pointer dereference

Noobs like me are ??? for many hours. go vet should warn are you really sure you want a local var instead of the global one mux =

@AlexRouSg
Copy link
Contributor

It does if you go vet -shadow=true

https://golang.org/cmd/vet/#hdr-Shadowed_variables

@ysmolski
Copy link
Member

Yes, and this setting is experimental (not default) meaning that sometimes it is desired to shadow the global var.

@gertcuykens
Copy link
Contributor Author

Doh! missed that sorry

@golang golang locked and limited conversation to collaborators Apr 15, 2019
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

4 participants