From bb57e940c30e757c18c6eb2e775f63ed6d175f38 Mon Sep 17 00:00:00 2001 From: Josselin Date: Fri, 28 Jun 2019 09:43:32 +0200 Subject: [PATCH] Factorise config parsing + add config parsing to slither-format --- slither/__main__.py | 41 +++------------------------- slither/utils/command_line.py | 46 +++++++++++++++++++++++++++++++- utils/slither_format/__main__.py | 17 +++++++++--- 3 files changed, 62 insertions(+), 42 deletions(-) diff --git a/slither/__main__.py b/slither/__main__.py index 5a0563fa3..0a26f8ff6 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -6,7 +6,6 @@ import inspect import json import logging import os -import subprocess import sys import traceback @@ -22,7 +21,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 @@ -253,30 +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_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', @@ -435,18 +411,7 @@ def parse_args(detector_classes, printer_classes): args = parser.parse_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))) + read_config_file(args) return args diff --git a/slither/utils/command_line.py b/slither/utils/command_line.py index d1a495a23..04bf812d9 100644 --- a/slither/utils/command_line.py +++ b/slither/utils/command_line.py @@ -1,9 +1,53 @@ import json +import os +import logging from collections import defaultdict from prettytable import PrettyTable - +from .colors import yellow, red from slither.detectors.abstract_detector import classification_txt +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_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 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): def extract_help(cls): diff --git a/utils/slither_format/__main__.py b/utils/slither_format/__main__.py index 992969dc4..c3e01bf76 100644 --- a/utils/slither_format/__main__.py +++ b/utils/slither_format/__main__.py @@ -1,13 +1,13 @@ -import os, sys +import sys import argparse from slither import Slither -from slither.utils.colors import red +from slither.utils.command_line import read_config_file import logging from .slither_format import slither_format from crytic_compile import cryticparser logging.basicConfig() -logging.getLogger("Slither").setLevel(logging.INFO) +logger = logging.getLogger("Slither").setLevel(logging.INFO) # Slither detectors for which slither-format currently works available_detectors = ["unused-state", @@ -40,6 +40,14 @@ def parse_args(): help='Do not generate patch files', action='store_true', default=False) + + + parser.add_argument('--config-file', + help='Provide a config file (default: slither.config.json)', + action='store', + dest='config_file', + default='slither.config.json') + group_detector = parser.add_argument_group('Detectors') group_detector.add_argument('--detect', @@ -75,6 +83,9 @@ def main(): # Parse all arguments args = parse_args() + read_config_file(args) + + # Perform slither analysis on the given filename slither = Slither(args.filename, **vars(args))