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"
10 "golang.org/x/tools/go/analysis"
11 "golang.org/x/tools/go/analysis/passes/inspect"
14 func 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),
23 var Analyzers = lint.InitializeAnalyzers(Docs, map[string]*analysis.Analyzer{
24 "SA1000": makeCallCheckerAnalyzer(checkRegexpRules),
27 Requires: []*analysis.Analyzer{inspect.Analyzer},
29 "SA1002": makeCallCheckerAnalyzer(checkTimeParseRules),
30 "SA1003": makeCallCheckerAnalyzer(checkEncodingBinaryRules),
32 Run: CheckTimeSleepConstant,
33 Requires: []*analysis.Analyzer{inspect.Analyzer},
37 Requires: []*analysis.Analyzer{inspect.Analyzer},
40 Run: CheckUnsafePrintf,
41 Requires: []*analysis.Analyzer{inspect.Analyzer},
43 "SA1007": makeCallCheckerAnalyzer(checkURLsRules),
45 Run: CheckCanonicalHeaderKey,
46 Requires: []*analysis.Analyzer{inspect.Analyzer},
48 "SA1010": makeCallCheckerAnalyzer(checkRegexpFindAllRules),
49 "SA1011": makeCallCheckerAnalyzer(checkUTF8CutsetRules),
52 Requires: []*analysis.Analyzer{inspect.Analyzer},
56 Requires: []*analysis.Analyzer{inspect.Analyzer},
58 "SA1014": makeCallCheckerAnalyzer(checkUnmarshalPointerRules),
60 Run: CheckLeakyTimeTick,
61 Requires: []*analysis.Analyzer{buildir.Analyzer},
64 Run: CheckUntrappableSignal,
65 Requires: []*analysis.Analyzer{inspect.Analyzer},
67 "SA1017": makeCallCheckerAnalyzer(checkUnbufferedSignalChanRules),
68 "SA1018": makeCallCheckerAnalyzer(checkStringsReplaceZeroRules),
71 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated, facts.Generated},
73 "SA1020": makeCallCheckerAnalyzer(checkListenAddressRules),
74 "SA1021": makeCallCheckerAnalyzer(checkBytesEqualIPRules),
76 Run: CheckWriterBufferModified,
77 Requires: []*analysis.Analyzer{buildir.Analyzer},
79 "SA1024": makeCallCheckerAnalyzer(checkUniqueCutsetRules),
81 Run: CheckTimerResetReturnValue,
82 Requires: []*analysis.Analyzer{buildir.Analyzer},
84 "SA1026": makeCallCheckerAnalyzer(checkUnsupportedMarshal),
85 "SA1027": makeCallCheckerAnalyzer(checkAtomicAlignment),
86 "SA1028": makeCallCheckerAnalyzer(checkSortSliceRules),
87 "SA1029": makeCallCheckerAnalyzer(checkWithValueKeyRules),
90 Run: CheckWaitgroupAdd,
91 Requires: []*analysis.Analyzer{inspect.Analyzer},
94 Run: CheckEmptyCriticalSection,
95 Requires: []*analysis.Analyzer{inspect.Analyzer},
98 Run: CheckConcurrentTesting,
99 Requires: []*analysis.Analyzer{buildir.Analyzer},
103 Requires: []*analysis.Analyzer{buildir.Analyzer},
107 Run: CheckTestMainExit,
108 Requires: []*analysis.Analyzer{inspect.Analyzer},
111 Run: CheckBenchmarkN,
112 Requires: []*analysis.Analyzer{inspect.Analyzer},
116 Run: CheckLhsRhsIdentical,
117 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
120 Run: CheckIneffectiveCopy,
121 Requires: []*analysis.Analyzer{inspect.Analyzer},
124 Run: CheckExtremeComparison,
125 Requires: []*analysis.Analyzer{inspect.Analyzer},
128 Run: CheckIneffectiveLoop,
129 Requires: []*analysis.Analyzer{inspect.Analyzer},
132 Run: CheckUnreadVariableValues,
133 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Generated},
136 Run: CheckLoopCondition,
137 Requires: []*analysis.Analyzer{buildir.Analyzer},
140 Run: CheckArgOverwritten,
141 Requires: []*analysis.Analyzer{buildir.Analyzer},
144 Run: CheckIneffectiveAppend,
145 Requires: []*analysis.Analyzer{buildir.Analyzer},
148 Run: CheckScopedBreak,
149 Requires: []*analysis.Analyzer{inspect.Analyzer},
152 Run: CheckNaNComparison,
153 Requires: []*analysis.Analyzer{buildir.Analyzer},
156 Run: CheckDoubleNegation,
157 Requires: []*analysis.Analyzer{inspect.Analyzer},
160 Run: CheckRepeatedIfElse,
161 Requires: []*analysis.Analyzer{inspect.Analyzer},
163 "SA4015": makeCallCheckerAnalyzer(checkMathIntRules),
165 Run: CheckSillyBitwiseOps,
166 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile},
169 Run: CheckPureFunctions,
170 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Purity},
173 Run: CheckSelfAssignment,
174 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile, facts.Purity},
177 Run: CheckDuplicateBuildConstraints,
178 Requires: []*analysis.Analyzer{facts.Generated},
181 Run: CheckUnreachableTypeCases,
182 Requires: []*analysis.Analyzer{inspect.Analyzer},
185 Run: CheckSingleArgAppend,
186 Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
189 Run: CheckAddressIsNil,
190 Requires: []*analysis.Analyzer{inspect.Analyzer},
193 Run: CheckTypedNilInterface,
194 Requires: []*analysis.Analyzer{buildir.Analyzer, typedness.Analysis, nilness.Analysis},
199 Requires: []*analysis.Analyzer{buildir.Analyzer},
202 Run: CheckEarlyDefer,
203 Requires: []*analysis.Analyzer{inspect.Analyzer},
206 Run: CheckInfiniteEmptyLoop,
207 Requires: []*analysis.Analyzer{inspect.Analyzer},
210 Run: CheckDeferInInfiniteLoop,
211 Requires: []*analysis.Analyzer{inspect.Analyzer},
214 Run: CheckLoopEmptyDefault,
215 Requires: []*analysis.Analyzer{inspect.Analyzer},
218 Run: CheckCyclicFinalizer,
219 Requires: []*analysis.Analyzer{buildir.Analyzer},
222 Run: CheckInfiniteRecursion,
223 Requires: []*analysis.Analyzer{buildir.Analyzer},
226 Run: CheckStructTags,
227 Requires: []*analysis.Analyzer{inspect.Analyzer},
229 "SA5009": makeCallCheckerAnalyzer(checkPrintfRules),
231 Run: CheckImpossibleTypeAssertion,
232 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile},
236 Requires: []*analysis.Analyzer{buildir.Analyzer},
239 Run: CheckEvenSliceLength,
240 FactTypes: []analysis.Fact{new(evenElements)},
241 Requires: []*analysis.Analyzer{buildir.Analyzer},
244 "SA6000": makeCallCheckerAnalyzer(checkRegexpMatchLoopRules),
246 Run: CheckMapBytesKey,
247 Requires: []*analysis.Analyzer{buildir.Analyzer},
249 "SA6002": makeCallCheckerAnalyzer(checkSyncPoolValueRules),
251 Run: CheckRangeStringRunes,
252 Requires: []*analysis.Analyzer{buildir.Analyzer},
255 Run: CheckToLowerToUpperComparison,
256 Requires: []*analysis.Analyzer{inspect.Analyzer},
260 Run: CheckDubiousDeferInChannelRangeLoop,
261 Requires: []*analysis.Analyzer{inspect.Analyzer},
264 Run: CheckNonOctalFileMode,
265 Requires: []*analysis.Analyzer{inspect.Analyzer},
268 Run: CheckEmptyBranch,
269 Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile, facts.Generated},
272 Run: CheckMissingEnumTypesInDeclaration,
273 Requires: []*analysis.Analyzer{inspect.Analyzer},
275 // Filtering generated code because it may include empty structs generated from data models.
276 "SA9005": makeCallCheckerAnalyzer(checkNoopMarshal, facts.Generated),
278 Run: CheckStaticBitShift,
279 Requires: []*analysis.Analyzer{inspect.Analyzer},