1package staticcheck
2
3import (
4	"honnef.co/go/tools/facts"
5	"honnef.co/go/tools/internal/passes/buildir"
6	"honnef.co/go/tools/lint/lintutil"
7
8	"golang.org/x/tools/go/analysis"
9	"golang.org/x/tools/go/analysis/passes/inspect"
10)
11
12func makeCallCheckerAnalyzer(rules map[string]CallCheck, extraReqs ...*analysis.Analyzer) *analysis.Analyzer {
13	reqs := []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile}
14	reqs = append(reqs, extraReqs...)
15	return &analysis.Analyzer{
16		Run:      callChecker(rules),
17		Requires: reqs,
18	}
19}
20
21var Analyzers = lintutil.InitializeAnalyzers(Docs, map[string]*analysis.Analyzer{
22	"SA1000": makeCallCheckerAnalyzer(checkRegexpRules),
23	"SA1001": {
24		Run:      CheckTemplate,
25		Requires: []*analysis.Analyzer{inspect.Analyzer},
26	},
27	"SA1002": makeCallCheckerAnalyzer(checkTimeParseRules),
28	"SA1003": makeCallCheckerAnalyzer(checkEncodingBinaryRules),
29	"SA1004": {
30		Run:      CheckTimeSleepConstant,
31		Requires: []*analysis.Analyzer{inspect.Analyzer},
32	},
33	"SA1005": {
34		Run:      CheckExec,
35		Requires: []*analysis.Analyzer{inspect.Analyzer},
36	},
37	"SA1006": {
38		Run:      CheckUnsafePrintf,
39		Requires: []*analysis.Analyzer{inspect.Analyzer},
40	},
41	"SA1007": makeCallCheckerAnalyzer(checkURLsRules),
42	"SA1008": {
43		Run:      CheckCanonicalHeaderKey,
44		Requires: []*analysis.Analyzer{inspect.Analyzer},
45	},
46	"SA1010": makeCallCheckerAnalyzer(checkRegexpFindAllRules),
47	"SA1011": makeCallCheckerAnalyzer(checkUTF8CutsetRules),
48	"SA1012": {
49		Run:      CheckNilContext,
50		Requires: []*analysis.Analyzer{inspect.Analyzer},
51	},
52	"SA1013": {
53		Run:      CheckSeeker,
54		Requires: []*analysis.Analyzer{inspect.Analyzer},
55	},
56	"SA1014": makeCallCheckerAnalyzer(checkUnmarshalPointerRules),
57	"SA1015": {
58		Run:      CheckLeakyTimeTick,
59		Requires: []*analysis.Analyzer{buildir.Analyzer},
60	},
61	"SA1016": {
62		Run:      CheckUntrappableSignal,
63		Requires: []*analysis.Analyzer{inspect.Analyzer},
64	},
65	"SA1017": makeCallCheckerAnalyzer(checkUnbufferedSignalChanRules),
66	"SA1018": makeCallCheckerAnalyzer(checkStringsReplaceZeroRules),
67	"SA1019": {
68		Run:      CheckDeprecated,
69		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated},
70	},
71	"SA1020": makeCallCheckerAnalyzer(checkListenAddressRules),
72	"SA1021": makeCallCheckerAnalyzer(checkBytesEqualIPRules),
73	"SA1023": {
74		Run:      CheckWriterBufferModified,
75		Requires: []*analysis.Analyzer{buildir.Analyzer},
76	},
77	"SA1024": makeCallCheckerAnalyzer(checkUniqueCutsetRules),
78	"SA1025": {
79		Run:      CheckTimerResetReturnValue,
80		Requires: []*analysis.Analyzer{buildir.Analyzer},
81	},
82	"SA1026": makeCallCheckerAnalyzer(checkUnsupportedMarshal),
83	"SA1027": makeCallCheckerAnalyzer(checkAtomicAlignment),
84	"SA1028": makeCallCheckerAnalyzer(checkSortSliceRules),
85	"SA1029": makeCallCheckerAnalyzer(checkWithValueKeyRules),
86
87	"SA2000": {
88		Run:      CheckWaitgroupAdd,
89		Requires: []*analysis.Analyzer{inspect.Analyzer},
90	},
91	"SA2001": {
92		Run:      CheckEmptyCriticalSection,
93		Requires: []*analysis.Analyzer{inspect.Analyzer},
94	},
95	"SA2002": {
96		Run:      CheckConcurrentTesting,
97		Requires: []*analysis.Analyzer{buildir.Analyzer},
98	},
99	"SA2003": {
100		Run:      CheckDeferLock,
101		Requires: []*analysis.Analyzer{buildir.Analyzer},
102	},
103
104	"SA3000": {
105		Run:      CheckTestMainExit,
106		Requires: []*analysis.Analyzer{inspect.Analyzer},
107	},
108	"SA3001": {
109		Run:      CheckBenchmarkN,
110		Requires: []*analysis.Analyzer{inspect.Analyzer},
111	},
112
113	"SA4000": {
114		Run:      CheckLhsRhsIdentical,
115		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
116	},
117	"SA4001": {
118		Run:      CheckIneffectiveCopy,
119		Requires: []*analysis.Analyzer{inspect.Analyzer},
120	},
121	"SA4003": {
122		Run:      CheckExtremeComparison,
123		Requires: []*analysis.Analyzer{inspect.Analyzer},
124	},
125	"SA4004": {
126		Run:      CheckIneffectiveLoop,
127		Requires: []*analysis.Analyzer{inspect.Analyzer},
128	},
129	"SA4006": {
130		Run:      CheckUnreadVariableValues,
131		Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Generated},
132	},
133	"SA4008": {
134		Run:      CheckLoopCondition,
135		Requires: []*analysis.Analyzer{buildir.Analyzer},
136	},
137	"SA4009": {
138		Run:      CheckArgOverwritten,
139		Requires: []*analysis.Analyzer{buildir.Analyzer},
140	},
141	"SA4010": {
142		Run:      CheckIneffectiveAppend,
143		Requires: []*analysis.Analyzer{buildir.Analyzer},
144	},
145	"SA4011": {
146		Run:      CheckScopedBreak,
147		Requires: []*analysis.Analyzer{inspect.Analyzer},
148	},
149	"SA4012": {
150		Run:      CheckNaNComparison,
151		Requires: []*analysis.Analyzer{buildir.Analyzer},
152	},
153	"SA4013": {
154		Run:      CheckDoubleNegation,
155		Requires: []*analysis.Analyzer{inspect.Analyzer},
156	},
157	"SA4014": {
158		Run:      CheckRepeatedIfElse,
159		Requires: []*analysis.Analyzer{inspect.Analyzer},
160	},
161	"SA4015": makeCallCheckerAnalyzer(checkMathIntRules),
162	"SA4016": {
163		Run:      CheckSillyBitwiseOps,
164		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile},
165	},
166	"SA4017": {
167		Run:      CheckPureFunctions,
168		Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Purity},
169	},
170	"SA4018": {
171		Run:      CheckSelfAssignment,
172		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile, facts.Purity},
173	},
174	"SA4019": {
175		Run:      CheckDuplicateBuildConstraints,
176		Requires: []*analysis.Analyzer{facts.Generated},
177	},
178	"SA4020": {
179		Run:      CheckUnreachableTypeCases,
180		Requires: []*analysis.Analyzer{inspect.Analyzer},
181	},
182	"SA4021": {
183		Run:      CheckSingleArgAppend,
184		Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
185	},
186
187	"SA5000": {
188		Run:      CheckNilMaps,
189		Requires: []*analysis.Analyzer{buildir.Analyzer},
190	},
191	"SA5001": {
192		Run:      CheckEarlyDefer,
193		Requires: []*analysis.Analyzer{inspect.Analyzer},
194	},
195	"SA5002": {
196		Run:      CheckInfiniteEmptyLoop,
197		Requires: []*analysis.Analyzer{inspect.Analyzer},
198	},
199	"SA5003": {
200		Run:      CheckDeferInInfiniteLoop,
201		Requires: []*analysis.Analyzer{inspect.Analyzer},
202	},
203	"SA5004": {
204		Run:      CheckLoopEmptyDefault,
205		Requires: []*analysis.Analyzer{inspect.Analyzer},
206	},
207	"SA5005": {
208		Run:      CheckCyclicFinalizer,
209		Requires: []*analysis.Analyzer{buildir.Analyzer},
210	},
211	"SA5007": {
212		Run:      CheckInfiniteRecursion,
213		Requires: []*analysis.Analyzer{buildir.Analyzer},
214	},
215	"SA5008": {
216		Run:      CheckStructTags,
217		Requires: []*analysis.Analyzer{inspect.Analyzer},
218	},
219	"SA5009": makeCallCheckerAnalyzer(checkPrintfRules),
220	"SA5010": {
221		Run:      CheckImpossibleTypeAssertion,
222		Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile},
223	},
224	"SA5011": {
225		Run:      CheckMaybeNil,
226		Requires: []*analysis.Analyzer{buildir.Analyzer},
227	},
228
229	"SA6000": makeCallCheckerAnalyzer(checkRegexpMatchLoopRules),
230	"SA6001": {
231		Run:      CheckMapBytesKey,
232		Requires: []*analysis.Analyzer{buildir.Analyzer},
233	},
234	"SA6002": makeCallCheckerAnalyzer(checkSyncPoolValueRules),
235	"SA6003": {
236		Run:      CheckRangeStringRunes,
237		Requires: []*analysis.Analyzer{buildir.Analyzer},
238	},
239	"SA6005": {
240		Run:      CheckToLowerToUpperComparison,
241		Requires: []*analysis.Analyzer{inspect.Analyzer},
242	},
243
244	"SA9001": {
245		Run:      CheckDubiousDeferInChannelRangeLoop,
246		Requires: []*analysis.Analyzer{inspect.Analyzer},
247	},
248	"SA9002": {
249		Run:      CheckNonOctalFileMode,
250		Requires: []*analysis.Analyzer{inspect.Analyzer},
251	},
252	"SA9003": {
253		Run:      CheckEmptyBranch,
254		Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile, facts.Generated},
255	},
256	"SA9004": {
257		Run:      CheckMissingEnumTypesInDeclaration,
258		Requires: []*analysis.Analyzer{inspect.Analyzer},
259	},
260	// Filtering generated code because it may include empty structs generated from data models.
261	"SA9005": makeCallCheckerAnalyzer(checkNoopMarshal, facts.Generated),
262
263	"SA4022": {
264		Run:      CheckAddressIsNil,
265		Requires: []*analysis.Analyzer{inspect.Analyzer},
266	},
267})
268