--- /dev/null
+package staticcheck
+
+import (
+ "honnef.co/go/tools/analysis/facts"
+ "honnef.co/go/tools/analysis/facts/nilness"
+ "honnef.co/go/tools/analysis/facts/typedness"
+ "honnef.co/go/tools/analysis/lint"
+ "honnef.co/go/tools/internal/passes/buildir"
+
+ "golang.org/x/tools/go/analysis"
+ "golang.org/x/tools/go/analysis/passes/inspect"
+)
+
+func makeCallCheckerAnalyzer(rules map[string]CallCheck, extraReqs ...*analysis.Analyzer) *analysis.Analyzer {
+ reqs := []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile}
+ reqs = append(reqs, extraReqs...)
+ return &analysis.Analyzer{
+ Run: callChecker(rules),
+ Requires: reqs,
+ }
+}
+
+var Analyzers = lint.InitializeAnalyzers(Docs, map[string]*analysis.Analyzer{
+ "SA1000": makeCallCheckerAnalyzer(checkRegexpRules),
+ "SA1001": {
+ Run: CheckTemplate,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1002": makeCallCheckerAnalyzer(checkTimeParseRules),
+ "SA1003": makeCallCheckerAnalyzer(checkEncodingBinaryRules),
+ "SA1004": {
+ Run: CheckTimeSleepConstant,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1005": {
+ Run: CheckExec,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1006": {
+ Run: CheckUnsafePrintf,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1007": makeCallCheckerAnalyzer(checkURLsRules),
+ "SA1008": {
+ Run: CheckCanonicalHeaderKey,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1010": makeCallCheckerAnalyzer(checkRegexpFindAllRules),
+ "SA1011": makeCallCheckerAnalyzer(checkUTF8CutsetRules),
+ "SA1012": {
+ Run: CheckNilContext,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1013": {
+ Run: CheckSeeker,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1014": makeCallCheckerAnalyzer(checkUnmarshalPointerRules),
+ "SA1015": {
+ Run: CheckLeakyTimeTick,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA1016": {
+ Run: CheckUntrappableSignal,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA1017": makeCallCheckerAnalyzer(checkUnbufferedSignalChanRules),
+ "SA1018": makeCallCheckerAnalyzer(checkStringsReplaceZeroRules),
+ "SA1019": {
+ Run: CheckDeprecated,
+ Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Deprecated, facts.Generated},
+ },
+ "SA1020": makeCallCheckerAnalyzer(checkListenAddressRules),
+ "SA1021": makeCallCheckerAnalyzer(checkBytesEqualIPRules),
+ "SA1023": {
+ Run: CheckWriterBufferModified,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA1024": makeCallCheckerAnalyzer(checkUniqueCutsetRules),
+ "SA1025": {
+ Run: CheckTimerResetReturnValue,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA1026": makeCallCheckerAnalyzer(checkUnsupportedMarshal),
+ "SA1027": makeCallCheckerAnalyzer(checkAtomicAlignment),
+ "SA1028": makeCallCheckerAnalyzer(checkSortSliceRules),
+ "SA1029": makeCallCheckerAnalyzer(checkWithValueKeyRules),
+
+ "SA2000": {
+ Run: CheckWaitgroupAdd,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA2001": {
+ Run: CheckEmptyCriticalSection,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA2002": {
+ Run: CheckConcurrentTesting,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA2003": {
+ Run: CheckDeferLock,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+
+ "SA3000": {
+ Run: CheckTestMainExit,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA3001": {
+ Run: CheckBenchmarkN,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+
+ "SA4000": {
+ Run: CheckLhsRhsIdentical,
+ Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile, facts.Generated},
+ },
+ "SA4001": {
+ Run: CheckIneffectiveCopy,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4003": {
+ Run: CheckExtremeComparison,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4004": {
+ Run: CheckIneffectiveLoop,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4006": {
+ Run: CheckUnreadVariableValues,
+ Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Generated},
+ },
+ "SA4008": {
+ Run: CheckLoopCondition,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA4009": {
+ Run: CheckArgOverwritten,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA4010": {
+ Run: CheckIneffectiveAppend,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA4011": {
+ Run: CheckScopedBreak,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4012": {
+ Run: CheckNaNComparison,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA4013": {
+ Run: CheckDoubleNegation,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4014": {
+ Run: CheckRepeatedIfElse,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4015": makeCallCheckerAnalyzer(checkMathIntRules),
+ "SA4016": {
+ Run: CheckSillyBitwiseOps,
+ Requires: []*analysis.Analyzer{inspect.Analyzer, facts.TokenFile},
+ },
+ "SA4017": {
+ Run: CheckPureFunctions,
+ Requires: []*analysis.Analyzer{buildir.Analyzer, facts.Purity},
+ },
+ "SA4018": {
+ Run: CheckSelfAssignment,
+ Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile, facts.Purity},
+ },
+ "SA4019": {
+ Run: CheckDuplicateBuildConstraints,
+ Requires: []*analysis.Analyzer{facts.Generated},
+ },
+ "SA4020": {
+ Run: CheckUnreachableTypeCases,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4021": {
+ Run: CheckSingleArgAppend,
+ Requires: []*analysis.Analyzer{inspect.Analyzer, facts.Generated, facts.TokenFile},
+ },
+ "SA4022": {
+ Run: CheckAddressIsNil,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA4023": {
+ Run: CheckTypedNilInterface,
+ Requires: []*analysis.Analyzer{buildir.Analyzer, typedness.Analysis, nilness.Analysis},
+ },
+
+ "SA5000": {
+ Run: CheckNilMaps,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA5001": {
+ Run: CheckEarlyDefer,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA5002": {
+ Run: CheckInfiniteEmptyLoop,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA5003": {
+ Run: CheckDeferInInfiniteLoop,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA5004": {
+ Run: CheckLoopEmptyDefault,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA5005": {
+ Run: CheckCyclicFinalizer,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA5007": {
+ Run: CheckInfiniteRecursion,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA5008": {
+ Run: CheckStructTags,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA5009": makeCallCheckerAnalyzer(checkPrintfRules),
+ "SA5010": {
+ Run: CheckImpossibleTypeAssertion,
+ Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile},
+ },
+ "SA5011": {
+ Run: CheckMaybeNil,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA5012": {
+ Run: CheckEvenSliceLength,
+ FactTypes: []analysis.Fact{new(evenElements)},
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+
+ "SA6000": makeCallCheckerAnalyzer(checkRegexpMatchLoopRules),
+ "SA6001": {
+ Run: CheckMapBytesKey,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA6002": makeCallCheckerAnalyzer(checkSyncPoolValueRules),
+ "SA6003": {
+ Run: CheckRangeStringRunes,
+ Requires: []*analysis.Analyzer{buildir.Analyzer},
+ },
+ "SA6005": {
+ Run: CheckToLowerToUpperComparison,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+
+ "SA9001": {
+ Run: CheckDubiousDeferInChannelRangeLoop,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA9002": {
+ Run: CheckNonOctalFileMode,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ "SA9003": {
+ Run: CheckEmptyBranch,
+ Requires: []*analysis.Analyzer{buildir.Analyzer, facts.TokenFile, facts.Generated},
+ },
+ "SA9004": {
+ Run: CheckMissingEnumTypesInDeclaration,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+ // Filtering generated code because it may include empty structs generated from data models.
+ "SA9005": makeCallCheckerAnalyzer(checkNoopMarshal, facts.Generated),
+ "SA9006": {
+ Run: CheckStaticBitShift,
+ Requires: []*analysis.Analyzer{inspect.Analyzer},
+ },
+})