analysis.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. package staticcheck
  2. import (
  3. "flag"
  4. "honnef.co/go/tools/facts"
  5. "honnef.co/go/tools/internal/passes/buildssa"
  6. "honnef.co/go/tools/lint/lintutil"
  7. "golang.org/x/tools/go/analysis"
  8. "golang.org/x/tools/go/analysis/passes/inspect"
  9. )
  10. func newFlagSet() flag.FlagSet {
  11. fs := flag.NewFlagSet("", flag.PanicOnError)
  12. fs.Var(lintutil.NewVersionFlag(), "go", "Target Go version")
  13. return *fs
  14. }
  15. var Analyzers = map[string]*analysis.Analyzer{
  16. "SA1000": {
  17. Name: "SA1000",
  18. Run: callChecker(checkRegexpRules),
  19. Doc: Docs["SA1000"].String(),
  20. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  21. Flags: newFlagSet(),
  22. },
  23. "SA1001": {
  24. Name: "SA1001",
  25. Run: CheckTemplate,
  26. Doc: Docs["SA1001"].String(),
  27. Requires: []*analysis.Analyzer{inspect.Analyzer},
  28. Flags: newFlagSet(),
  29. },
  30. "SA1002": {
  31. Name: "SA1002",
  32. Run: callChecker(checkTimeParseRules),
  33. Doc: Docs["SA1002"].String(),
  34. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  35. Flags: newFlagSet(),
  36. },
  37. "SA1003": {
  38. Name: "SA1003",
  39. Run: callChecker(checkEncodingBinaryRules),
  40. Doc: Docs["SA1003"].String(),
  41. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  42. Flags: newFlagSet(),
  43. },
  44. "SA1004": {
  45. Name: "SA1004",
  46. Run: CheckTimeSleepConstant,
  47. Doc: Docs["SA1004"].String(),
  48. Requires: []*analysis.Analyzer{inspect.Analyzer},
  49. Flags: newFlagSet(),
  50. },
  51. "SA1005": {
  52. Name: "SA1005",
  53. Run: CheckExec,
  54. Doc: Docs["SA1005"].String(),
  55. Requires: []*analysis.Analyzer{inspect.Analyzer},
  56. Flags: newFlagSet(),
  57. },
  58. "SA1006": {
  59. Name: "SA1006",
  60. Run: CheckUnsafePrintf,
  61. Doc: Docs["SA1006"].String(),
  62. Requires: []*analysis.Analyzer{inspect.Analyzer},
  63. Flags: newFlagSet(),
  64. },
  65. "SA1007": {
  66. Name: "SA1007",
  67. Run: callChecker(checkURLsRules),
  68. Doc: Docs["SA1007"].String(),
  69. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  70. Flags: newFlagSet(),
  71. },
  72. "SA1008": {
  73. Name: "SA1008",
  74. Run: CheckCanonicalHeaderKey,
  75. Doc: Docs["SA1008"].String(),
  76. Requires: []*analysis.Analyzer{inspect.Analyzer},
  77. Flags: newFlagSet(),
  78. },
  79. "SA1010": {
  80. Name: "SA1010",
  81. Run: callChecker(checkRegexpFindAllRules),
  82. Doc: Docs["SA1010"].String(),
  83. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  84. Flags: newFlagSet(),
  85. },
  86. "SA1011": {
  87. Name: "SA1011",
  88. Run: callChecker(checkUTF8CutsetRules),
  89. Doc: Docs["SA1011"].String(),
  90. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  91. Flags: newFlagSet(),
  92. },
  93. "SA1012": {
  94. Name: "SA1012",
  95. Run: CheckNilContext,
  96. Doc: Docs["SA1012"].String(),
  97. Requires: []*analysis.Analyzer{inspect.Analyzer},
  98. Flags: newFlagSet(),
  99. },
  100. "SA1013": {
  101. Name: "SA1013",
  102. Run: CheckSeeker,
  103. Doc: Docs["SA1013"].String(),
  104. Requires: []*analysis.Analyzer{inspect.Analyzer},
  105. Flags: newFlagSet(),
  106. },
  107. "SA1014": {
  108. Name: "SA1014",
  109. Run: callChecker(checkUnmarshalPointerRules),
  110. Doc: Docs["SA1014"].String(),
  111. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  112. Flags: newFlagSet(),
  113. },
  114. "SA1015": {
  115. Name: "SA1015",
  116. Run: CheckLeakyTimeTick,
  117. Doc: Docs["SA1015"].String(),
  118. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  119. Flags: newFlagSet(),
  120. },
  121. "SA1016": {
  122. Name: "SA1016",
  123. Run: CheckUntrappableSignal,
  124. Doc: Docs["SA1016"].String(),
  125. Requires: []*analysis.Analyzer{inspect.Analyzer},
  126. Flags: newFlagSet(),
  127. },
  128. "SA1017": {
  129. Name: "SA1017",
  130. Run: callChecker(checkUnbufferedSignalChanRules),
  131. Doc: Docs["SA1017"].String(),
  132. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  133. Flags: newFlagSet(),
  134. },
  135. "SA1018": {
  136. Name: "SA1018",
  137. Run: callChecker(checkStringsReplaceZeroRules),
  138. Doc: Docs["SA1018"].String(),
  139. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  140. Flags: newFlagSet(),
  141. },
  142. "SA1019": {
  143. Name: "SA1019",
  144. Run: CheckDeprecated,
  145. Doc: Docs["SA1019"].String(),
  146. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated},
  147. Flags: newFlagSet(),
  148. },
  149. "SA1020": {
  150. Name: "SA1020",
  151. Run: callChecker(checkListenAddressRules),
  152. Doc: Docs["SA1020"].String(),
  153. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  154. Flags: newFlagSet(),
  155. },
  156. "SA1021": {
  157. Name: "SA1021",
  158. Run: callChecker(checkBytesEqualIPRules),
  159. Doc: Docs["SA1021"].String(),
  160. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  161. Flags: newFlagSet(),
  162. },
  163. "SA1023": {
  164. Name: "SA1023",
  165. Run: CheckWriterBufferModified,
  166. Doc: Docs["SA1023"].String(),
  167. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  168. Flags: newFlagSet(),
  169. },
  170. "SA1024": {
  171. Name: "SA1024",
  172. Run: callChecker(checkUniqueCutsetRules),
  173. Doc: Docs["SA1024"].String(),
  174. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  175. Flags: newFlagSet(),
  176. },
  177. "SA1025": {
  178. Name: "SA1025",
  179. Run: CheckTimerResetReturnValue,
  180. Doc: Docs["SA1025"].String(),
  181. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  182. Flags: newFlagSet(),
  183. },
  184. "SA1026": {
  185. Name: "SA1026",
  186. Run: callChecker(checkUnsupportedMarshal),
  187. Doc: Docs["SA1026"].String(),
  188. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  189. Flags: newFlagSet(),
  190. },
  191. "SA1027": {
  192. Name: "SA1027",
  193. Run: callChecker(checkAtomicAlignment),
  194. Doc: Docs["SA1027"].String(),
  195. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  196. Flags: newFlagSet(),
  197. },
  198. "SA2000": {
  199. Name: "SA2000",
  200. Run: CheckWaitgroupAdd,
  201. Doc: Docs["SA2000"].String(),
  202. Requires: []*analysis.Analyzer{inspect.Analyzer},
  203. Flags: newFlagSet(),
  204. },
  205. "SA2001": {
  206. Name: "SA2001",
  207. Run: CheckEmptyCriticalSection,
  208. Doc: Docs["SA2001"].String(),
  209. Requires: []*analysis.Analyzer{inspect.Analyzer},
  210. Flags: newFlagSet(),
  211. },
  212. "SA2002": {
  213. Name: "SA2002",
  214. Run: CheckConcurrentTesting,
  215. Doc: Docs["SA2002"].String(),
  216. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  217. Flags: newFlagSet(),
  218. },
  219. "SA2003": {
  220. Name: "SA2003",
  221. Run: CheckDeferLock,
  222. Doc: Docs["SA2003"].String(),
  223. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  224. Flags: newFlagSet(),
  225. },
  226. "SA3000": {
  227. Name: "SA3000",
  228. Run: CheckTestMainExit,
  229. Doc: Docs["SA3000"].String(),
  230. Requires: []*analysis.Analyzer{inspect.Analyzer},
  231. Flags: newFlagSet(),
  232. },
  233. "SA3001": {
  234. Name: "SA3001",
  235. Run: CheckBenchmarkN,
  236. Doc: Docs["SA3001"].String(),
  237. Requires: []*analysis.Analyzer{inspect.Analyzer},
  238. Flags: newFlagSet(),
  239. },
  240. "SA4000": {
  241. Name: "SA4000",
  242. Run: CheckLhsRhsIdentical,
  243. Doc: Docs["SA4000"].String(),
  244. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
  245. Flags: newFlagSet(),
  246. },
  247. "SA4001": {
  248. Name: "SA4001",
  249. Run: CheckIneffectiveCopy,
  250. Doc: Docs["SA4001"].String(),
  251. Requires: []*analysis.Analyzer{inspect.Analyzer},
  252. Flags: newFlagSet(),
  253. },
  254. "SA4002": {
  255. Name: "SA4002",
  256. Run: CheckDiffSizeComparison,
  257. Doc: Docs["SA4002"].String(),
  258. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  259. Flags: newFlagSet(),
  260. },
  261. "SA4003": {
  262. Name: "SA4003",
  263. Run: CheckExtremeComparison,
  264. Doc: Docs["SA4003"].String(),
  265. Requires: []*analysis.Analyzer{inspect.Analyzer},
  266. Flags: newFlagSet(),
  267. },
  268. "SA4004": {
  269. Name: "SA4004",
  270. Run: CheckIneffectiveLoop,
  271. Doc: Docs["SA4004"].String(),
  272. Requires: []*analysis.Analyzer{inspect.Analyzer},
  273. Flags: newFlagSet(),
  274. },
  275. "SA4006": {
  276. Name: "SA4006",
  277. Run: CheckUnreadVariableValues,
  278. Doc: Docs["SA4006"].String(),
  279. Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Generated},
  280. Flags: newFlagSet(),
  281. },
  282. "SA4008": {
  283. Name: "SA4008",
  284. Run: CheckLoopCondition,
  285. Doc: Docs["SA4008"].String(),
  286. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  287. Flags: newFlagSet(),
  288. },
  289. "SA4009": {
  290. Name: "SA4009",
  291. Run: CheckArgOverwritten,
  292. Doc: Docs["SA4009"].String(),
  293. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  294. Flags: newFlagSet(),
  295. },
  296. "SA4010": {
  297. Name: "SA4010",
  298. Run: CheckIneffectiveAppend,
  299. Doc: Docs["SA4010"].String(),
  300. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  301. Flags: newFlagSet(),
  302. },
  303. "SA4011": {
  304. Name: "SA4011",
  305. Run: CheckScopedBreak,
  306. Doc: Docs["SA4011"].String(),
  307. Requires: []*analysis.Analyzer{inspect.Analyzer},
  308. Flags: newFlagSet(),
  309. },
  310. "SA4012": {
  311. Name: "SA4012",
  312. Run: CheckNaNComparison,
  313. Doc: Docs["SA4012"].String(),
  314. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  315. Flags: newFlagSet(),
  316. },
  317. "SA4013": {
  318. Name: "SA4013",
  319. Run: CheckDoubleNegation,
  320. Doc: Docs["SA4013"].String(),
  321. Requires: []*analysis.Analyzer{inspect.Analyzer},
  322. Flags: newFlagSet(),
  323. },
  324. "SA4014": {
  325. Name: "SA4014",
  326. Run: CheckRepeatedIfElse,
  327. Doc: Docs["SA4014"].String(),
  328. Requires: []*analysis.Analyzer{inspect.Analyzer},
  329. Flags: newFlagSet(),
  330. },
  331. "SA4015": {
  332. Name: "SA4015",
  333. Run: callChecker(checkMathIntRules),
  334. Doc: Docs["SA4015"].String(),
  335. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  336. Flags: newFlagSet(),
  337. },
  338. "SA4016": {
  339. Name: "SA4016",
  340. Run: CheckSillyBitwiseOps,
  341. Doc: Docs["SA4016"].String(),
  342. Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile},
  343. Flags: newFlagSet(),
  344. },
  345. "SA4017": {
  346. Name: "SA4017",
  347. Run: CheckPureFunctions,
  348. Doc: Docs["SA4017"].String(),
  349. Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.Purity},
  350. Flags: newFlagSet(),
  351. },
  352. "SA4018": {
  353. Name: "SA4018",
  354. Run: CheckSelfAssignment,
  355. Doc: Docs["SA4018"].String(),
  356. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
  357. Flags: newFlagSet(),
  358. },
  359. "SA4019": {
  360. Name: "SA4019",
  361. Run: CheckDuplicateBuildConstraints,
  362. Doc: Docs["SA4019"].String(),
  363. Requires: []*analysis.Analyzer{facts.Generated},
  364. Flags: newFlagSet(),
  365. },
  366. "SA4020": {
  367. Name: "SA4020",
  368. Run: CheckUnreachableTypeCases,
  369. Doc: Docs["SA4020"].String(),
  370. Requires: []*analysis.Analyzer{inspect.Analyzer},
  371. Flags: newFlagSet(),
  372. },
  373. "SA4021": {
  374. Name: "SA4021",
  375. Run: CheckSingleArgAppend,
  376. Doc: Docs["SA4021"].String(),
  377. Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
  378. Flags: newFlagSet(),
  379. },
  380. "SA5000": {
  381. Name: "SA5000",
  382. Run: CheckNilMaps,
  383. Doc: Docs["SA5000"].String(),
  384. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  385. Flags: newFlagSet(),
  386. },
  387. "SA5001": {
  388. Name: "SA5001",
  389. Run: CheckEarlyDefer,
  390. Doc: Docs["SA5001"].String(),
  391. Requires: []*analysis.Analyzer{inspect.Analyzer},
  392. Flags: newFlagSet(),
  393. },
  394. "SA5002": {
  395. Name: "SA5002",
  396. Run: CheckInfiniteEmptyLoop,
  397. Doc: Docs["SA5002"].String(),
  398. Requires: []*analysis.Analyzer{inspect.Analyzer},
  399. Flags: newFlagSet(),
  400. },
  401. "SA5003": {
  402. Name: "SA5003",
  403. Run: CheckDeferInInfiniteLoop,
  404. Doc: Docs["SA5003"].String(),
  405. Requires: []*analysis.Analyzer{inspect.Analyzer},
  406. Flags: newFlagSet(),
  407. },
  408. "SA5004": {
  409. Name: "SA5004",
  410. Run: CheckLoopEmptyDefault,
  411. Doc: Docs["SA5004"].String(),
  412. Requires: []*analysis.Analyzer{inspect.Analyzer},
  413. Flags: newFlagSet(),
  414. },
  415. "SA5005": {
  416. Name: "SA5005",
  417. Run: CheckCyclicFinalizer,
  418. Doc: Docs["SA5005"].String(),
  419. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  420. Flags: newFlagSet(),
  421. },
  422. "SA5007": {
  423. Name: "SA5007",
  424. Run: CheckInfiniteRecursion,
  425. Doc: Docs["SA5007"].String(),
  426. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  427. Flags: newFlagSet(),
  428. },
  429. "SA5008": {
  430. Name: "SA5008",
  431. Run: CheckStructTags,
  432. Doc: Docs["SA5008"].String(),
  433. Requires: []*analysis.Analyzer{inspect.Analyzer},
  434. Flags: newFlagSet(),
  435. },
  436. "SA5009": {
  437. Name: "SA5009",
  438. Run: callChecker(checkPrintfRules),
  439. Doc: Docs["SA5009"].String(),
  440. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  441. Flags: newFlagSet(),
  442. },
  443. "SA6000": {
  444. Name: "SA6000",
  445. Run: callChecker(checkRegexpMatchLoopRules),
  446. Doc: Docs["SA6000"].String(),
  447. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  448. Flags: newFlagSet(),
  449. },
  450. "SA6001": {
  451. Name: "SA6001",
  452. Run: CheckMapBytesKey,
  453. Doc: Docs["SA6001"].String(),
  454. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  455. Flags: newFlagSet(),
  456. },
  457. "SA6002": {
  458. Name: "SA6002",
  459. Run: callChecker(checkSyncPoolValueRules),
  460. Doc: Docs["SA6002"].String(),
  461. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer},
  462. Flags: newFlagSet(),
  463. },
  464. "SA6003": {
  465. Name: "SA6003",
  466. Run: CheckRangeStringRunes,
  467. Doc: Docs["SA6003"].String(),
  468. Requires: []*analysis.Analyzer{buildssa.Analyzer},
  469. Flags: newFlagSet(),
  470. },
  471. "SA6005": {
  472. Name: "SA6005",
  473. Run: CheckToLowerToUpperComparison,
  474. Doc: Docs["SA6005"].String(),
  475. Requires: []*analysis.Analyzer{inspect.Analyzer},
  476. Flags: newFlagSet(),
  477. },
  478. "SA9001": {
  479. Name: "SA9001",
  480. Run: CheckDubiousDeferInChannelRangeLoop,
  481. Doc: Docs["SA9001"].String(),
  482. Requires: []*analysis.Analyzer{inspect.Analyzer},
  483. Flags: newFlagSet(),
  484. },
  485. "SA9002": {
  486. Name: "SA9002",
  487. Run: CheckNonOctalFileMode,
  488. Doc: Docs["SA9002"].String(),
  489. Requires: []*analysis.Analyzer{inspect.Analyzer},
  490. Flags: newFlagSet(),
  491. },
  492. "SA9003": {
  493. Name: "SA9003",
  494. Run: CheckEmptyBranch,
  495. Doc: Docs["SA9003"].String(),
  496. Requires: []*analysis.Analyzer{buildssa.Analyzer, facts.TokenFile, facts.Generated},
  497. Flags: newFlagSet(),
  498. },
  499. "SA9004": {
  500. Name: "SA9004",
  501. Run: CheckMissingEnumTypesInDeclaration,
  502. Doc: Docs["SA9004"].String(),
  503. Requires: []*analysis.Analyzer{inspect.Analyzer},
  504. Flags: newFlagSet(),
  505. },
  506. // Filtering generated code because it may include empty structs generated from data models.
  507. "SA9005": {
  508. Name: "SA9005",
  509. Run: callChecker(checkNoopMarshal),
  510. Doc: Docs["SA9005"].String(),
  511. Requires: []*analysis.Analyzer{buildssa.Analyzer, valueRangesAnalyzer, facts.Generated, facts.TokenFile},
  512. Flags: newFlagSet(),
  513. },
  514. }