diff --git a/slither/__main__.py b/slither/__main__.py index 52a0fc4ca..6c66d6bbc 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -22,7 +22,8 @@ from slither.slither import Slither from slither.utils.colors import red, yellow, set_colorization_enabled from slither.utils.command_line import (output_detectors, output_results_to_markdown, output_detectors_json, output_printers, - output_to_markdown, output_wiki) + output_to_markdown, output_wiki, defaults_flag_in_config, + read_config_file) from crytic_compile import is_supported from slither.exceptions import SlitherException @@ -45,7 +46,6 @@ def process(filename, args, detector_classes, printer_classes): ast = '--ast-compact-json' if args.legacy_ast: ast = '--ast-json' - args.filter_paths = parse_filter_paths(args) slither = Slither(filename, ast_format=ast, **vars(args)) @@ -84,12 +84,7 @@ def process_files(filenames, args, detector_classes, printer_classes): all_contracts.append(contract_loaded['ast']) slither = Slither(all_contracts, - solc=args.solc, - disable_solc_warnings=args.disable_solc_warnings, - solc_arguments=args.solc_args, - filter_paths=parse_filter_paths(args), - triage_mode=args.triage_mode, - exclude_dependencies=args.exclude_dependencies) + **vars(args)) return _process(slither, detector_classes, printer_classes) @@ -258,33 +253,6 @@ def parse_filter_paths(args): return args.filter_paths.split(',') return [] -# Those are the flags shared by the command line and the config file -defaults_flag_in_config = { - 'detectors_to_run': 'all', - 'printers_to_run': None, - 'detectors_to_exclude': None, - 'exclude_dependencies': False, - 'exclude_optimization': False, - 'exclude_informational': False, - 'exclude_low': False, - 'exclude_medium': False, - 'exclude_high': False, - 'solc': 'solc', - 'solc_args': None, - 'disable_solc_warnings': False, - 'json': None, - 'truffle_version': None, - 'disable_color': False, - 'filter_paths': None, - 'truffle_ignore_compile': False, - 'truffle_build_directory': 'build/contracts', - 'embark_ignore_compile': False, - 'embark_overwrite_config': False, - # debug command - 'legacy_ast': False, - 'ignore_return_value': False - } - def parse_args(detector_classes, printer_classes): parser = argparse.ArgumentParser(description='Slither. For usage information, see https://github.com/crytic/slither/wiki/Usage', usage="slither.py contract.sol [flag]") @@ -451,19 +419,9 @@ def parse_args(detector_classes, printer_classes): sys.exit(1) args = parser.parse_args() + read_config_file(args) - if os.path.isfile(args.config_file): - try: - with open(args.config_file) as f: - config = json.load(f) - for key, elem in config.items(): - if key not in defaults_flag_in_config: - logger.info(yellow('{} has an unknown key: {} : {}'.format(args.config_file, key, elem))) - continue - if getattr(args, key) == defaults_flag_in_config[key]: - setattr(args, key, elem) - except json.decoder.JSONDecodeError as e: - logger.error(red('Impossible to read {}, please check the file {}'.format(args.config_file, e))) + args.filter_paths = parse_filter_paths(args) return args @@ -536,6 +494,8 @@ def main_impl(all_detector_classes, all_printer_classes): :param all_detector_classes: A list of all detectors that can be included/excluded. :param all_printer_classes: A list of all printers that can be included. """ + # Set logger of Slither to info, to catch warnings related to the arg parsing + logger.setLevel(logging.INFO) args = parse_args(all_detector_classes, all_printer_classes) # Set colorization option diff --git a/slither/utils/command_line.py b/slither/utils/command_line.py index d1a495a23..2b811ec22 100644 --- a/slither/utils/command_line.py +++ b/slither/utils/command_line.py @@ -1,8 +1,49 @@ +import os +import logging import json from collections import defaultdict from prettytable import PrettyTable +from crytic_compile.cryticparser.defaults import defaults_flag_in_config as defaults_flag_in_config_crytic_compile from slither.detectors.abstract_detector import classification_txt +from .colors import yellow, red + +logger = logging.getLogger("Slither") + +# Those are the flags shared by the command line and the config file +defaults_flag_in_config = { + 'detectors_to_run': 'all', + 'printers_to_run': None, + 'detectors_to_exclude': None, + 'exclude_dependencies': False, + 'exclude_informational': False, + 'exclude_optimization': False, + 'exclude_low': False, + 'exclude_medium': False, + 'exclude_high': False, + 'json': None, + 'disable_color': False, + 'filter_paths': None, + # debug command + 'legacy_ast': False, + 'ignore_return_value': False, + **defaults_flag_in_config_crytic_compile + } + +def read_config_file(args): + if os.path.isfile(args.config_file): + try: + with open(args.config_file) as f: + config = json.load(f) + for key, elem in config.items(): + if key not in defaults_flag_in_config: + logger.info(yellow('{} has an unknown key: {} : {}'.format(args.config_file, key, elem))) + continue + if getattr(args, key) == defaults_flag_in_config[key]: + setattr(args, key, elem) + except json.decoder.JSONDecodeError as e: + logger.error(red('Impossible to read {}, please check the file {}'.format(args.config_file, e))) + def output_to_markdown(detector_classes, printer_classes, filter_wiki):