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