analysis.go 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. package staticcheck
  2. import (
  3. "honnef.co/go/tools/analysis/facts"
  4. "honnef.co/go/tools/analysis/facts/nilness"
  5. "honnef.co/go/tools/analysis/facts/typedness"
  6. "honnef.co/go/tools/analysis/lint"
  7. "honnef.co/go/tools/internal/passes/buildir"
  8. "golang.org/x/tools/go/analysis"
  9. "golang.org/x/tools/go/analysis/passes/inspect"
  10. )
  11. func makeCallCheckerAnalyzer(rules map[string]CallCheck, extraReqs ...*analysis.Analyzer) *analysis.Analyzer {
  12. reqs := []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile}
  13. reqs = append(reqs, extraReqs...)
  14. return &analysis.Analyzer{
  15. Run: callChecker(rules),
  16. Requires: reqs,
  17. }
  18. }
  19. var Analyzers = lint.InitializeAnalyzers(Docs, map[string]*analysis.Analyzer{
  20. "SA1000": makeCallCheckerAnalyzer(checkRegexpRules),
  21. "SA1001": {
  22. Run: CheckTemplate,
  23. Requires: []*analysis.Analyzer{inspect.Analyzer},
  24. },
  25. "SA1002": makeCallCheckerAnalyzer(checkTimeParseRules),
  26. "SA1003": makeCallCheckerAnalyzer(checkEncodingBinaryRules),
  27. "SA1004": {
  28. Run: CheckTimeSleepConstant,
  29. Requires: []*analysis.Analyzer{inspect.Analyzer},
  30. },
  31. "SA1005": {
  32. Run: CheckExec,
  33. Requires: []*analysis.Analyzer{inspect.Analyzer},
  34. },
  35. "SA1006": {
  36. Run: CheckUnsafePrintf,
  37. Requires: []*analysis.Analyzer{inspect.Analyzer},
  38. },
  39. "SA1007": makeCallCheckerAnalyzer(checkURLsRules),
  40. "SA1008": {
  41. Run: CheckCanonicalHeaderKey,
  42. Requires: []*analysis.Analyzer{inspect.Analyzer},
  43. },
  44. "SA1010": makeCallCheckerAnalyzer(checkRegexpFindAllRules),
  45. "SA1011": makeCallCheckerAnalyzer(checkUTF8CutsetRules),
  46. "SA1012": {
  47. Run: CheckNilContext,
  48. Requires: []*analysis.Analyzer{inspect.Analyzer},
  49. },
  50. "SA1013": {
  51. Run: CheckSeeker,
  52. Requires: []*analysis.Analyzer{inspect.Analyzer},
  53. },
  54. "SA1014": makeCallCheckerAnalyzer(checkUnmarshalPointerRules),
  55. "SA1015": {
  56. Run: CheckLeakyTimeTick,
  57. Requires: []*analysis.Analyzer{buildir.Analyzer},
  58. },
  59. "SA1016": {
  60. Run: CheckUntrappableSignal,
  61. Requires: []*analysis.Analyzer{inspect.Analyzer},
  62. },
  63. "SA1017": makeCallCheckerAnalyzer(checkUnbufferedSignalChanRules),
  64. "SA1018": makeCallCheckerAnalyzer(checkStringsReplaceZeroRules),
  65. "SA1019": {
  66. Run: CheckDeprecated,
  67. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated, facts.Generated},
  68. },
  69. "SA1020": makeCallCheckerAnalyzer(checkListenAddressRules),
  70. "SA1021": makeCallCheckerAnalyzer(checkBytesEqualIPRules),
  71. "SA1023": {
  72. Run: CheckWriterBufferModified,
  73. Requires: []*analysis.Analyzer{buildir.Analyzer},
  74. },
  75. "SA1024": makeCallCheckerAnalyzer(checkUniqueCutsetRules),
  76. "SA1025": {
  77. Run: CheckTimerResetReturnValue,
  78. Requires: []*analysis.Analyzer{buildir.Analyzer},
  79. },
  80. "SA1026": makeCallCheckerAnalyzer(checkUnsupportedMarshal),
  81. "SA1027": makeCallCheckerAnalyzer(checkAtomicAlignment),
  82. "SA1028": makeCallCheckerAnalyzer(checkSortSliceRules),
  83. "SA1029": makeCallCheckerAnalyzer(checkWithValueKeyRules),
  84. "SA1030": makeCallCheckerAnalyzer(checkStrconvRules),
  85. "SA2000": {
  86. Run: CheckWaitgroupAdd,
  87. Requires: []*analysis.Analyzer{inspect.Analyzer},
  88. },
  89. "SA2001": {
  90. Run: CheckEmptyCriticalSection,
  91. Requires: []*analysis.Analyzer{inspect.Analyzer},
  92. },
  93. "SA2002": {
  94. Run: CheckConcurrentTesting,
  95. Requires: []*analysis.Analyzer{buildir.Analyzer},
  96. },
  97. "SA2003": {
  98. Run: CheckDeferLock,
  99. Requires: []*analysis.Analyzer{buildir.Analyzer},
  100. },
  101. "SA3000": {
  102. Run: CheckTestMainExit,
  103. Requires: []*analysis.Analyzer{inspect.Analyzer},
  104. },
  105. "SA3001": {
  106. Run: CheckBenchmarkN,
  107. Requires: []*analysis.Analyzer{inspect.Analyzer},
  108. },
  109. "SA4000": {
  110. Run: CheckLhsRhsIdentical,
  111. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
  112. },
  113. "SA4001": {
  114. Run: CheckIneffectiveCopy,
  115. Requires: []*analysis.Analyzer{inspect.Analyzer},
  116. },
  117. "SA4003": {
  118. Run: CheckExtremeComparison,
  119. Requires: []*analysis.Analyzer{inspect.Analyzer},
  120. },
  121. "SA4004": {
  122. Run: CheckIneffectiveLoop,
  123. Requires: []*analysis.Analyzer{inspect.Analyzer},
  124. },
  125. "SA4005": {
  126. Run: CheckIneffectiveFieldAssignments,
  127. Requires: []*analysis.Analyzer{buildir.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. "SA4022": {
  187. Run: CheckAddressIsNil,
  188. Requires: []*analysis.Analyzer{inspect.Analyzer},
  189. },
  190. "SA4023": {
  191. Run: CheckTypedNilInterface,
  192. Requires: []*analysis.Analyzer{buildir.Analyzer, typedness.Analysis, nilness.Analysis},
  193. },
  194. "SA4024": {
  195. Run: CheckBuiltinZeroComparison,
  196. Requires: []*analysis.Analyzer{inspect.Analyzer},
  197. },
  198. "SA4025": {
  199. Run: CheckIntegerDivisionEqualsZero,
  200. Requires: []*analysis.Analyzer{inspect.Analyzer},
  201. },
  202. "SA4026": {
  203. Run: CheckNegativeZeroFloat,
  204. Requires: []*analysis.Analyzer{inspect.Analyzer},
  205. },
  206. "SA4027": {
  207. Run: CheckIneffectiveURLQueryModification,
  208. Requires: []*analysis.Analyzer{inspect.Analyzer},
  209. },
  210. "SA4028": {
  211. Run: CheckModuloOne,
  212. Requires: []*analysis.Analyzer{inspect.Analyzer},
  213. },
  214. "SA4029": {
  215. Run: CheckIneffectiveSort,
  216. Requires: []*analysis.Analyzer{inspect.Analyzer},
  217. },
  218. "SA4030": {
  219. Run: CheckIneffectiveRandInt,
  220. Requires: []*analysis.Analyzer{inspect.Analyzer},
  221. },
  222. "SA4031": {
  223. Run: CheckAllocationNilCheck,
  224. Requires: []*analysis.Analyzer{buildir.Analyzer, inspect.Analyzer, facts.TokenFile},
  225. },
  226. "SA5000": {
  227. Run: CheckNilMaps,
  228. Requires: []*analysis.Analyzer{buildir.Analyzer},
  229. },
  230. "SA5001": {
  231. Run: CheckEarlyDefer,
  232. Requires: []*analysis.Analyzer{inspect.Analyzer},
  233. },
  234. "SA5002": {
  235. Run: CheckInfiniteEmptyLoop,
  236. Requires: []*analysis.Analyzer{inspect.Analyzer},
  237. },
  238. "SA5003": {
  239. Run: CheckDeferInInfiniteLoop,
  240. Requires: []*analysis.Analyzer{inspect.Analyzer},
  241. },
  242. "SA5004": {
  243. Run: CheckLoopEmptyDefault,
  244. Requires: []*analysis.Analyzer{inspect.Analyzer},
  245. },
  246. "SA5005": {
  247. Run: CheckCyclicFinalizer,
  248. Requires: []*analysis.Analyzer{buildir.Analyzer},
  249. },
  250. "SA5007": {
  251. Run: CheckInfiniteRecursion,
  252. Requires: []*analysis.Analyzer{buildir.Analyzer},
  253. },
  254. "SA5008": {
  255. Run: CheckStructTags,
  256. Requires: []*analysis.Analyzer{inspect.Analyzer},
  257. },
  258. "SA5009": makeCallCheckerAnalyzer(checkPrintfRules),
  259. "SA5010": {
  260. Run: CheckImpossibleTypeAssertion,
  261. Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile},
  262. },
  263. "SA5011": {
  264. Run: CheckMaybeNil,
  265. Requires: []*analysis.Analyzer{buildir.Analyzer},
  266. },
  267. "SA5012": {
  268. Run: CheckEvenSliceLength,
  269. FactTypes: []analysis.Fact{new(evenElements)},
  270. Requires: []*analysis.Analyzer{buildir.Analyzer},
  271. },
  272. "SA6000": makeCallCheckerAnalyzer(checkRegexpMatchLoopRules),
  273. "SA6001": {
  274. Run: CheckMapBytesKey,
  275. Requires: []*analysis.Analyzer{buildir.Analyzer},
  276. },
  277. "SA6002": makeCallCheckerAnalyzer(checkSyncPoolValueRules),
  278. "SA6003": {
  279. Run: CheckRangeStringRunes,
  280. Requires: []*analysis.Analyzer{buildir.Analyzer},
  281. },
  282. "SA6005": {
  283. Run: CheckToLowerToUpperComparison,
  284. Requires: []*analysis.Analyzer{inspect.Analyzer},
  285. },
  286. "SA9001": {
  287. Run: CheckDubiousDeferInChannelRangeLoop,
  288. Requires: []*analysis.Analyzer{inspect.Analyzer},
  289. },
  290. "SA9002": {
  291. Run: CheckNonOctalFileMode,
  292. Requires: []*analysis.Analyzer{inspect.Analyzer},
  293. },
  294. "SA9003": {
  295. Run: CheckEmptyBranch,
  296. Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile, facts.Generated},
  297. },
  298. "SA9004": {
  299. Run: CheckMissingEnumTypesInDeclaration,
  300. Requires: []*analysis.Analyzer{inspect.Analyzer},
  301. },
  302. // Filtering generated code because it may include empty structs generated from data models.
  303. "SA9005": makeCallCheckerAnalyzer(checkNoopMarshal, facts.Generated),
  304. "SA9006": {
  305. Run: CheckStaticBitShift,
  306. Requires: []*analysis.Analyzer{inspect.Analyzer},
  307. },
  308. "SA9007": {
  309. Run: CheckBadRemoveAll,
  310. Requires: []*analysis.Analyzer{buildir.Analyzer},
  311. },
  312. "SA9008": {
  313. Run: CheckTypeAssertionShadowingElse,
  314. Requires: []*analysis.Analyzer{inspect.Analyzer, buildir.Analyzer, facts.TokenFile},
  315. },
  316. })