1// Copyright 2023 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5// Package godebugs provides a table of known GODEBUG settings,
6// for use by a variety of other packages, including internal/godebug,
7// runtime, runtime/metrics, and cmd/go/internal/load.
8package godebugs
9
10// An Info describes a single known GODEBUG setting.
11type Info struct {
12	Name    string // name of the setting ("panicnil")
13	Package string // package that uses the setting ("runtime")
14	Changed int    // minor version when default changed, if any; 21 means Go 1.21
15	Old     string // value that restores behavior prior to Changed
16	Opaque  bool   // setting does not export information to runtime/metrics using [internal/godebug.Setting.IncNonDefault]
17}
18
19// All is the table of known settings, sorted by Name.
20//
21// Note: After adding entries to this table, run 'go generate runtime/metrics'
22// to update the runtime/metrics doc comment.
23// (Otherwise the runtime/metrics test will fail.)
24//
25// Note: After adding entries to this table, update the list in doc/godebug.md as well.
26// (Otherwise the test in this package will fail.)
27var All = []Info{
28	{Name: "asynctimerchan", Package: "time", Changed: 23, Old: "1"},
29	{Name: "execerrdot", Package: "os/exec"},
30	{Name: "gocachehash", Package: "cmd/go"},
31	{Name: "gocachetest", Package: "cmd/go"},
32	{Name: "gocacheverify", Package: "cmd/go"},
33	{Name: "gotypesalias", Package: "go/types", Changed: 23, Old: "0"},
34	{Name: "http2client", Package: "net/http"},
35	{Name: "http2debug", Package: "net/http", Opaque: true},
36	{Name: "http2server", Package: "net/http"},
37	{Name: "httplaxcontentlength", Package: "net/http", Changed: 22, Old: "1"},
38	{Name: "httpmuxgo121", Package: "net/http", Changed: 22, Old: "1"},
39	{Name: "httpservecontentkeepheaders", Package: "net/http", Changed: 23, Old: "1"},
40	{Name: "installgoroot", Package: "go/build"},
41	{Name: "jstmpllitinterp", Package: "html/template", Opaque: true}, // bug #66217: remove Opaque
42	//{Name: "multipartfiles", Package: "mime/multipart"},
43	{Name: "multipartmaxheaders", Package: "mime/multipart"},
44	{Name: "multipartmaxparts", Package: "mime/multipart"},
45	{Name: "multipathtcp", Package: "net"},
46	{Name: "netdns", Package: "net", Opaque: true},
47	{Name: "netedns0", Package: "net", Changed: 19, Old: "0"},
48	{Name: "panicnil", Package: "runtime", Changed: 21, Old: "1"},
49	{Name: "randautoseed", Package: "math/rand"},
50	{Name: "tarinsecurepath", Package: "archive/tar"},
51	{Name: "tls10server", Package: "crypto/tls", Changed: 22, Old: "1"},
52	{Name: "tls3des", Package: "crypto/tls", Changed: 23, Old: "1"},
53	{Name: "tlskyber", Package: "crypto/tls", Changed: 23, Old: "0", Opaque: true},
54	{Name: "tlsmaxrsasize", Package: "crypto/tls"},
55	{Name: "tlsrsakex", Package: "crypto/tls", Changed: 22, Old: "1"},
56	{Name: "tlsunsafeekm", Package: "crypto/tls", Changed: 22, Old: "1"},
57	{Name: "winreadlinkvolume", Package: "os", Changed: 22, Old: "0"},
58	{Name: "winsymlink", Package: "os", Changed: 22, Old: "0"},
59	{Name: "x509keypairleaf", Package: "crypto/tls", Changed: 23, Old: "0"},
60	{Name: "x509negativeserial", Package: "crypto/x509", Changed: 23, Old: "1"},
61	{Name: "x509sha1", Package: "crypto/x509"},
62	{Name: "x509usefallbackroots", Package: "crypto/x509"},
63	{Name: "x509usepolicies", Package: "crypto/x509"},
64	{Name: "zipinsecurepath", Package: "archive/zip"},
65}
66
67// Lookup returns the Info with the given name.
68func Lookup(name string) *Info {
69	// binary search, avoiding import of sort.
70	lo := 0
71	hi := len(All)
72	for lo < hi {
73		m := int(uint(lo+hi) >> 1)
74		mid := All[m].Name
75		if name == mid {
76			return &All[m]
77		}
78		if name < mid {
79			hi = m
80		} else {
81			lo = m + 1
82		}
83	}
84	return nil
85}
86