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,10 @@ 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 (
216
+ set (detectors_to_run ), args .detectors_to_run , detectors
217
+ )
226
218
return detectors_to_run
227
219
228
220
if args .exclude_optimization :
@@ -234,24 +226,48 @@ def choose_detectors(
234
226
detectors_to_run = [
235
227
d for d in detectors_to_run if d .IMPACT != DetectorClassification .INFORMATIONAL
236
228
]
229
+
237
230
if args .exclude_low :
238
231
detectors_to_run = [d for d in detectors_to_run if d .IMPACT != DetectorClassification .LOW ]
232
+
239
233
if args .exclude_medium :
240
234
detectors_to_run = [
241
235
d for d in detectors_to_run if d .IMPACT != DetectorClassification .MEDIUM
242
236
]
237
+
243
238
if args .exclude_high :
244
239
detectors_to_run = [d for d in detectors_to_run if d .IMPACT != DetectorClassification .HIGH ]
240
+
245
241
if args .detectors_to_exclude :
246
242
detectors_to_run = [
247
243
d for d in detectors_to_run if d .ARGUMENT not in args .detectors_to_exclude
248
244
]
249
245
250
- detectors_to_run = sorted (detectors_to_run , key = lambda x : x .IMPACT )
246
+ if args .detectors_to_include :
247
+ detectors_to_run = __include_detectors (
248
+ set (detectors_to_run ), args .detectors_to_include , detectors
249
+ )
251
250
252
251
return detectors_to_run
253
252
254
253
254
+ def __include_detectors (
255
+ detectors_to_run : Set [Type [AbstractDetector ]],
256
+ detectors_to_include : str ,
257
+ detectors : Dict [str , Type [AbstractDetector ]],
258
+ ) -> List [Type [AbstractDetector ]]:
259
+ include_detectors = detectors_to_include .split ("," )
260
+
261
+ for detector in include_detectors :
262
+ if detector in detectors :
263
+ detectors_to_run .add (detectors [detector ])
264
+ else :
265
+ raise ValueError (f"Error: { detector } is not a detector" )
266
+
267
+ detectors_to_run = sorted (detectors_to_run , key = lambda x : x .IMPACT )
268
+ return detectors_to_run
269
+
270
+
255
271
def choose_printers (
256
272
args : argparse .Namespace , all_printer_classes : List [Type [AbstractPrinter ]]
257
273
) -> List [Type [AbstractPrinter ]]:
@@ -407,6 +423,14 @@ def parse_args(
407
423
default = defaults_flag_in_config ["exclude_high" ],
408
424
)
409
425
426
+ group_detector .add_argument (
427
+ "--include-detectors" ,
428
+ help = "Comma-separated list of detectors that should be included" ,
429
+ action = "store" ,
430
+ dest = "detectors_to_include" ,
431
+ default = defaults_flag_in_config ["detectors_to_include" ],
432
+ )
433
+
410
434
fail_on_group = group_detector .add_mutually_exclusive_group ()
411
435
fail_on_group .add_argument (
412
436
"--fail-pedantic" ,
0 commit comments