11
11
import sys
12
12
import traceback
13
13
from importlib import metadata
14
- from typing import Tuple , Optional , List , Dict , Type , Union , Any , Sequence
14
+ from typing import Any , Dict , List , Optional , Sequence , Set , Tuple , Type , Union
15
15
16
16
17
17
from crytic_compile import cryticparser , CryticCompile , InvalidCompilation
@@ -211,18 +211,8 @@ def choose_detectors(
211
211
212
212
if args .detectors_to_run == "all" :
213
213
detectors_to_run = all_detector_classes
214
- if args .detectors_to_exclude :
215
- detectors_excluded = args .detectors_to_exclude .split ("," )
216
- for detector in detectors :
217
- if detector in detectors_excluded :
218
- detectors_to_run .remove (detectors [detector ])
219
214
else :
220
- for detector in args .detectors_to_run .split ("," ):
221
- if detector in detectors :
222
- detectors_to_run .append (detectors [detector ])
223
- else :
224
- raise ValueError (f"Error: { detector } is not a detector" )
225
- detectors_to_run = sorted (detectors_to_run , key = lambda x : x .IMPACT )
215
+ detectors_to_run = __include_detectors (set (detectors_to_run ), args .detectors_to_run , detectors )
226
216
return detectors_to_run
227
217
228
218
if args .exclude_optimization :
@@ -234,24 +224,46 @@ def choose_detectors(
234
224
detectors_to_run = [
235
225
d for d in detectors_to_run if d .IMPACT != DetectorClassification .INFORMATIONAL
236
226
]
227
+
237
228
if args .exclude_low :
238
229
detectors_to_run = [d for d in detectors_to_run if d .IMPACT != DetectorClassification .LOW ]
230
+
239
231
if args .exclude_medium :
240
232
detectors_to_run = [
241
233
d for d in detectors_to_run if d .IMPACT != DetectorClassification .MEDIUM
242
234
]
235
+
243
236
if args .exclude_high :
244
237
detectors_to_run = [d for d in detectors_to_run if d .IMPACT != DetectorClassification .HIGH ]
238
+
245
239
if args .detectors_to_exclude :
246
240
detectors_to_run = [
247
241
d for d in detectors_to_run if d .ARGUMENT not in args .detectors_to_exclude
248
242
]
249
243
250
- detectors_to_run = sorted (detectors_to_run , key = lambda x : x .IMPACT )
244
+ if args .detectors_to_include :
245
+ detectors_to_run = __include_detectors (set (detectors_to_run ), args .detectors_to_include , detectors )
251
246
252
247
return detectors_to_run
253
248
254
249
250
+ def __include_detectors (
251
+ detectors_to_run : Set [Type [AbstractDetector ]],
252
+ detectors_to_include : str ,
253
+ detectors : Dict [str , Type [AbstractDetector ]],
254
+ ) -> List [Type [AbstractDetector ]]:
255
+ include_detectors = detectors_to_include .split ("," )
256
+
257
+ for detector in include_detectors :
258
+ if detector in detectors :
259
+ detectors_to_run .add (detectors [detector ])
260
+ else :
261
+ raise ValueError (f"Error: { detector } is not a detector" )
262
+
263
+ detectors_to_run = sorted (detectors_to_run , key = lambda x : x .IMPACT )
264
+ return detectors_to_run
265
+
266
+
255
267
def choose_printers (
256
268
args : argparse .Namespace , all_printer_classes : List [Type [AbstractPrinter ]]
257
269
) -> List [Type [AbstractPrinter ]]:
@@ -407,6 +419,14 @@ def parse_args(
407
419
default = defaults_flag_in_config ["exclude_high" ],
408
420
)
409
421
422
+ group_detector .add_argument (
423
+ "--include-detectors" ,
424
+ help = "Comma-separated list of detectors that should be included" ,
425
+ action = "store" ,
426
+ dest = "detectors_to_include" ,
427
+ default = defaults_flag_in_config ["detectors_to_include" ],
428
+ )
429
+
410
430
fail_on_group = group_detector .add_mutually_exclusive_group ()
411
431
fail_on_group .add_argument (
412
432
"--fail-pedantic" ,
0 commit comments