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