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