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  })