Skip to content

Commit e2daa8a

Browse files
committed
Add detectors_to_include to override exclude args
1 parent ded705d commit e2daa8a

File tree

2 files changed

+45
-29
lines changed

2 files changed

+45
-29
lines changed

slither/__main__.py

Lines changed: 44 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import sys
1212
import traceback
1313
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
1515

1616

1717
from crytic_compile import cryticparser, CryticCompile, InvalidCompilation
@@ -211,47 +211,54 @@ def choose_detectors(
211211

212212
if args.detectors_to_run == "all":
213213
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])
219214
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+
)
226218
return detectors_to_run
227219

228-
if args.exclude_optimization:
229-
detectors_to_run = [
230-
d for d in detectors_to_run if d.IMPACT != DetectorClassification.OPTIMIZATION
231-
]
220+
classification_map = {
221+
DetectorClassification.HIGH: args.exclude_high,
222+
DetectorClassification.MEDIUM: args.exclude_medium,
223+
DetectorClassification.LOW: args.exclude_low,
224+
DetectorClassification.INFORMATIONAL: args.exclude_informational,
225+
DetectorClassification.OPTIMIZATION: args.exclude_optimization,
226+
}
227+
excluded_classification = [
228+
classification for classification, included in classification_map.items() if included
229+
]
230+
detectors_to_run = [d for d in detectors_to_run if d.IMPACT not in excluded_classification]
232231

233-
if args.exclude_informational:
234-
detectors_to_run = [
235-
d for d in detectors_to_run if d.IMPACT != DetectorClassification.INFORMATIONAL
236-
]
237-
if args.exclude_low:
238-
detectors_to_run = [d for d in detectors_to_run if d.IMPACT != DetectorClassification.LOW]
239-
if args.exclude_medium:
240-
detectors_to_run = [
241-
d for d in detectors_to_run if d.IMPACT != DetectorClassification.MEDIUM
242-
]
243-
if args.exclude_high:
244-
detectors_to_run = [d for d in detectors_to_run if d.IMPACT != DetectorClassification.HIGH]
245232
if args.detectors_to_exclude:
246233
detectors_to_run = [
247234
d for d in detectors_to_run if d.ARGUMENT not in args.detectors_to_exclude
248235
]
249236

250-
detectors_to_run = sorted(detectors_to_run, key=lambda x: x.IMPACT)
237+
if args.detectors_to_include:
238+
detectors_to_run = __include_detectors(
239+
set(detectors_to_run), args.detectors_to_include, detectors
240+
)
251241

252242
return detectors_to_run
253243

254244

245+
def __include_detectors(
246+
detectors_to_run: Set[Type[AbstractDetector]],
247+
detectors_to_include: str,
248+
detectors: Dict[str, Type[AbstractDetector]],
249+
) -> List[Type[AbstractDetector]]:
250+
include_detectors = detectors_to_include.split(",")
251+
252+
for detector in include_detectors:
253+
if detector in detectors:
254+
detectors_to_run.add(detectors[detector])
255+
else:
256+
raise ValueError(f"Error: {detector} is not a detector")
257+
258+
detectors_to_run = sorted(detectors_to_run, key=lambda x: x.IMPACT)
259+
return detectors_to_run
260+
261+
255262
def choose_printers(
256263
args: argparse.Namespace, all_printer_classes: List[Type[AbstractPrinter]]
257264
) -> List[Type[AbstractPrinter]]:
@@ -407,6 +414,14 @@ def parse_args(
407414
default=defaults_flag_in_config["exclude_high"],
408415
)
409416

417+
group_detector.add_argument(
418+
"--include-detectors",
419+
help="Comma-separated list of detectors that should be included",
420+
action="store",
421+
dest="detectors_to_include",
422+
default=defaults_flag_in_config["detectors_to_include"],
423+
)
424+
410425
fail_on_group = group_detector.add_mutually_exclusive_group()
411426
fail_on_group.add_argument(
412427
"--fail-pedantic",

slither/utils/command_line.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ class FailOnLevel(enum.Enum):
4848
"detectors_to_run": "all",
4949
"printers_to_run": None,
5050
"detectors_to_exclude": None,
51+
"detectors_to_include": None,
5152
"exclude_dependencies": False,
5253
"exclude_informational": False,
5354
"exclude_optimization": False,

0 commit comments

Comments
 (0)