4 "honnef.co/go/tools/facts"
5 "honnef.co/go/tools/internal/passes/buildir"
6 "honnef.co/go/tools/lint/lintutil"
8 "golang.org/x/tools/go/analysis"
9 "golang.org/x/tools/go/analysis/passes/inspect"
12 func 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),
21 var Analyzers = lintutil.InitializeAnalyzers(Docs, map[string]*analysis.Analyzer{
22 "SA1000": makeCallCheckerAnalyzer(checkRegexpRules),
25 Requires: []*analysis.Analyzer{inspect.Analyzer},
27 "SA1002": makeCallCheckerAnalyzer(checkTimeParseRules),
28 "SA1003": makeCallCheckerAnalyzer(checkEncodingBinaryRules),
30 Run: CheckTimeSleepConstant,
31 Requires: []*analysis.Analyzer{inspect.Analyzer},
35 Requires: []*analysis.Analyzer{inspect.Analyzer},
38 Run: CheckUnsafePrintf,
39 Requires: []*analysis.Analyzer{inspect.Analyzer},
41 "SA1007": makeCallCheckerAnalyzer(checkURLsRules),
43 Run: CheckCanonicalHeaderKey,
44 Requires: []*analysis.Analyzer{inspect.Analyzer},
46 "SA1010": makeCallCheckerAnalyzer(checkRegexpFindAllRules),
47 "SA1011": makeCallCheckerAnalyzer(checkUTF8CutsetRules),
50 Requires: []*analysis.Analyzer{inspect.Analyzer},
54 Requires: []*analysis.Analyzer{inspect.Analyzer},
56 "SA1014": makeCallCheckerAnalyzer(checkUnmarshalPointerRules),
58 Run: CheckLeakyTimeTick,
59 Requires: []*analysis.Analyzer{buildir.Analyzer},
62 Run: CheckUntrappableSignal,
63 Requires: []*analysis.Analyzer{inspect.Analyzer},
65 "SA1017": makeCallCheckerAnalyzer(checkUnbufferedSignalChanRules),
66 "SA1018": makeCallCheckerAnalyzer(checkStringsReplaceZeroRules),
69 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated, facts.Generated},
71 "SA1020": makeCallCheckerAnalyzer(checkListenAddressRules),
72 "SA1021": makeCallCheckerAnalyzer(checkBytesEqualIPRules),
74 Run: CheckWriterBufferModified,
75 Requires: []*analysis.Analyzer{buildir.Analyzer},
77 "SA1024": makeCallCheckerAnalyzer(checkUniqueCutsetRules),
79 Run: CheckTimerResetReturnValue,
80 Requires: []*analysis.Analyzer{buildir.Analyzer},
82 "SA1026": makeCallCheckerAnalyzer(checkUnsupportedMarshal),
83 "SA1027": makeCallCheckerAnalyzer(checkAtomicAlignment),
84 "SA1028": makeCallCheckerAnalyzer(checkSortSliceRules),
85 "SA1029": makeCallCheckerAnalyzer(checkWithValueKeyRules),
88 Run: CheckWaitgroupAdd,
89 Requires: []*analysis.Analyzer{inspect.Analyzer},
92 Run: CheckEmptyCriticalSection,
93 Requires: []*analysis.Analyzer{inspect.Analyzer},
96 Run: CheckConcurrentTesting,
97 Requires: []*analysis.Analyzer{buildir.Analyzer},
101 Requires: []*analysis.Analyzer{buildir.Analyzer},
105 Run: CheckTestMainExit,
106 Requires: []*analysis.Analyzer{inspect.Analyzer},
109 Run: CheckBenchmarkN,
110 Requires: []*analysis.Analyzer{inspect.Analyzer},
114 Run: CheckLhsRhsIdentical,
115 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
118 Run: CheckIneffectiveCopy,
119 Requires: []*analysis.Analyzer{inspect.Analyzer},
122 Run: CheckExtremeComparison,
123 Requires: []*analysis.Analyzer{inspect.Analyzer},
126 Run: CheckIneffectiveLoop,
127 Requires: []*analysis.Analyzer{inspect.Analyzer},
130 Run: CheckUnreadVariableValues,
131 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Generated},
134 Run: CheckLoopCondition,
135 Requires: []*analysis.Analyzer{buildir.Analyzer},
138 Run: CheckArgOverwritten,
139 Requires: []*analysis.Analyzer{buildir.Analyzer},
142 Run: CheckIneffectiveAppend,
143 Requires: []*analysis.Analyzer{buildir.Analyzer},
146 Run: CheckScopedBreak,
147 Requires: []*analysis.Analyzer{inspect.Analyzer},
150 Run: CheckNaNComparison,
151 Requires: []*analysis.Analyzer{buildir.Analyzer},
154 Run: CheckDoubleNegation,
155 Requires: []*analysis.Analyzer{inspect.Analyzer},
158 Run: CheckRepeatedIfElse,
159 Requires: []*analysis.Analyzer{inspect.Analyzer},
161 "SA4015": makeCallCheckerAnalyzer(checkMathIntRules),
163 Run: CheckSillyBitwiseOps,
164 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile},
167 Run: CheckPureFunctions,
168 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Purity},
171 Run: CheckSelfAssignment,
172 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile, facts.Purity},
175 Run: CheckDuplicateBuildConstraints,
176 Requires: []*analysis.Analyzer{facts.Generated},
179 Run: CheckUnreachableTypeCases,
180 Requires: []*analysis.Analyzer{inspect.Analyzer},
183 Run: CheckSingleArgAppend,
184 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
189 Requires: []*analysis.Analyzer{buildir.Analyzer},
192 Run: CheckEarlyDefer,
193 Requires: []*analysis.Analyzer{inspect.Analyzer},
196 Run: CheckInfiniteEmptyLoop,
197 Requires: []*analysis.Analyzer{inspect.Analyzer},
200 Run: CheckDeferInInfiniteLoop,
201 Requires: []*analysis.Analyzer{inspect.Analyzer},
204 Run: CheckLoopEmptyDefault,
205 Requires: []*analysis.Analyzer{inspect.Analyzer},
208 Run: CheckCyclicFinalizer,
209 Requires: []*analysis.Analyzer{buildir.Analyzer},
212 Run: CheckInfiniteRecursion,
213 Requires: []*analysis.Analyzer{buildir.Analyzer},
216 Run: CheckStructTags,
217 Requires: []*analysis.Analyzer{inspect.Analyzer},
219 "SA5009": makeCallCheckerAnalyzer(checkPrintfRules),
221 Run: CheckImpossibleTypeAssertion,
222 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile},
226 Requires: []*analysis.Analyzer{buildir.Analyzer},
229 "SA6000": makeCallCheckerAnalyzer(checkRegexpMatchLoopRules),
231 Run: CheckMapBytesKey,
232 Requires: []*analysis.Analyzer{buildir.Analyzer},
234 "SA6002": makeCallCheckerAnalyzer(checkSyncPoolValueRules),
236 Run: CheckRangeStringRunes,
237 Requires: []*analysis.Analyzer{buildir.Analyzer},
240 Run: CheckToLowerToUpperComparison,
241 Requires: []*analysis.Analyzer{inspect.Analyzer},
245 Run: CheckDubiousDeferInChannelRangeLoop,
246 Requires: []*analysis.Analyzer{inspect.Analyzer},
249 Run: CheckNonOctalFileMode,
250 Requires: []*analysis.Analyzer{inspect.Analyzer},
253 Run: CheckEmptyBranch,
254 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile, facts.Generated},
257 Run: CheckMissingEnumTypesInDeclaration,
258 Requires: []*analysis.Analyzer{inspect.Analyzer},
260 // Filtering generated code because it may include empty structs generated from data models.
261 "SA9005": makeCallCheckerAnalyzer(checkNoopMarshal, facts.Generated),
264 Run: CheckAddressIsNil,
265 Requires: []*analysis.Analyzer{inspect.Analyzer},