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