def main(): # ------------------------------ # Usage: python3 -m slither_format filename # Example: python3 -m slither_format contract.sol # ------------------------------ # Parse all arguments args = parse_args() read_config_file(args) # Perform slither analysis on the given filename slither = Slither(args.filename, **vars(args)) # Format the input files based on slither analysis slither_format(slither, **vars(args))
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]") parser.add_argument('filename', help='contract.sol') cryticparser.init(parser) parser.add_argument('--version', help='displays the current version', version=require('slither-analyzer')[0].version, action='version') group_detector = parser.add_argument_group('Detectors') group_printer = parser.add_argument_group('Printers') group_misc = parser.add_argument_group('Additional options') group_detector.add_argument('--detect', help='Comma-separated list of detectors, defaults to all, ' 'available detectors: {}'.format( ', '.join(d.ARGUMENT for d in detector_classes)), action='store', dest='detectors_to_run', default=defaults_flag_in_config['detectors_to_run']) group_printer.add_argument('--print', help='Comma-separated list fo contract information printers, ' 'available printers: {}'.format( ', '.join(d.ARGUMENT for d in printer_classes)), action='store', dest='printers_to_run', default=defaults_flag_in_config['printers_to_run']) group_detector.add_argument('--list-detectors', help='List available detectors', action=ListDetectors, nargs=0, default=False) group_printer.add_argument('--list-printers', help='List available printers', action=ListPrinters, nargs=0, default=False) group_detector.add_argument('--exclude', help='Comma-separated list of detectors that should be excluded', action='store', dest='detectors_to_exclude', default=defaults_flag_in_config['detectors_to_exclude']) group_detector.add_argument('--exclude-dependencies', help='Exclude results that are only related to dependencies', action='store_true', default=defaults_flag_in_config['exclude_dependencies']) group_detector.add_argument('--exclude-optimization', help='Exclude optimization analyses', action='store_true', default=defaults_flag_in_config['exclude_optimization']) group_detector.add_argument('--exclude-informational', help='Exclude informational impact analyses', action='store_true', default=defaults_flag_in_config['exclude_informational']) group_detector.add_argument('--exclude-low', help='Exclude low impact analyses', action='store_true', default=defaults_flag_in_config['exclude_low']) group_detector.add_argument('--exclude-medium', help='Exclude medium impact analyses', action='store_true', default=defaults_flag_in_config['exclude_medium']) group_detector.add_argument('--exclude-high', help='Exclude high impact analyses', action='store_true', default=defaults_flag_in_config['exclude_high']) group_misc.add_argument('--json', help='Export the results as a JSON file ("--json -" to export to stdout)', action='store', default=defaults_flag_in_config['json']) group_misc.add_argument('--json-types', help=f'Comma-separated list of result types to output to JSON, defaults to ' + \ f'{",".join(output_type for output_type in DEFAULT_JSON_OUTPUT_TYPES)}. ' + \ f'Available types: {",".join(output_type for output_type in JSON_OUTPUT_TYPES)}', action='store', default=defaults_flag_in_config['json-types']) group_misc.add_argument('--zip', help='Export the results as a zipped JSON file', action='store', default=defaults_flag_in_config['zip']) group_misc.add_argument('--zip-type', help=f'Zip compression type. One of {",".join(ZIP_TYPES_ACCEPTED.keys())}. Default lzma', action='store', default=defaults_flag_in_config['zip_type']) group_misc.add_argument('--markdown-root', help='URL for markdown generation', action='store', default="") group_misc.add_argument('--disable-color', help='Disable output colorization', action='store_true', default=defaults_flag_in_config['disable_color']) group_misc.add_argument('--filter-paths', help='Comma-separated list of paths for which results will be excluded', action='store', dest='filter_paths', default=defaults_flag_in_config['filter_paths']) group_misc.add_argument('--triage-mode', help='Run triage mode (save results in slither.db.json)', action='store_true', dest='triage_mode', default=False) group_misc.add_argument('--config-file', help='Provide a config file (default: slither.config.json)', action='store', dest='config_file', default='slither.config.json') group_misc.add_argument('--solc-ast', help='Provide the contract as a json AST', action='store_true', default=False) group_misc.add_argument('--generate-patches', help='Generate patches (json output only)', action='store_true', default=False) # debugger command parser.add_argument('--debug', help=argparse.SUPPRESS, action="store_true", default=False) parser.add_argument('--markdown', help=argparse.SUPPRESS, action=OutputMarkdown, default=False) group_misc.add_argument('--checklist', help=argparse.SUPPRESS, action='store_true', default=False) parser.add_argument('--wiki-detectors', help=argparse.SUPPRESS, action=OutputWiki, default=False) parser.add_argument('--list-detectors-json', help=argparse.SUPPRESS, action=ListDetectorsJson, nargs=0, default=False) parser.add_argument('--legacy-ast', help=argparse.SUPPRESS, action='store_true', default=defaults_flag_in_config['legacy_ast']) parser.add_argument('--ignore-return-value', help=argparse.SUPPRESS, action='store_true', default=defaults_flag_in_config['ignore_return_value']) # if the json is splitted in different files parser.add_argument('--splitted', help=argparse.SUPPRESS, action='store_true', default=False) # Disable the throw/catch on partial analyses parser.add_argument('--disallow-partial', help=argparse.SUPPRESS, action="store_true", default=False) if len(sys.argv) == 1: parser.print_help(sys.stderr) sys.exit(1) args = parser.parse_args() read_config_file(args) args.filter_paths = parse_filter_paths(args) # Verify our json-type output is valid args.json_types = set(args.json_types.split(',')) for json_type in args.json_types: if json_type not in JSON_OUTPUT_TYPES: raise Exception(f"Error: \"{json_type}\" is not a valid JSON result output type.") return args
def parse_args(detector_classes, printer_classes): # pylint: disable=too-many-statements usage = "slither target [flag]\n" usage += "\ntarget can be:\n" usage += "\t- file.sol // a Solidity file\n" usage += "\t- project_directory // a project directory. See https://github.com/crytic/crytic-compile/#crytic-compile for the supported platforms\n" usage += "\t- 0x.. // a contract on mainet\n" usage += f"\t- NETWORK:0x.. // a contract on a different network. Supported networks: {','.join(x[:-1] for x in SUPPORTED_NETWORK)}\n" parser = argparse.ArgumentParser( description= "For usage information, see https://github.com/crytic/slither/wiki/Usage", usage=usage, ) parser.add_argument("filename", help=argparse.SUPPRESS) cryticparser.init(parser) parser.add_argument( "--version", help="displays the current version", version=require("slither-analyzer")[0].version, action="version", ) group_detector = parser.add_argument_group("Detectors") group_printer = parser.add_argument_group("Printers") group_misc = parser.add_argument_group("Additional options") group_detector.add_argument( "--detect", help="Comma-separated list of detectors, defaults to all, " "available detectors: {}".format(", ".join(d.ARGUMENT for d in detector_classes)), action="store", dest="detectors_to_run", default=defaults_flag_in_config["detectors_to_run"], ) group_printer.add_argument( "--print", help="Comma-separated list fo contract information printers, " "available printers: {}".format(", ".join(d.ARGUMENT for d in printer_classes)), action="store", dest="printers_to_run", default=defaults_flag_in_config["printers_to_run"], ) group_detector.add_argument( "--list-detectors", help="List available detectors", action=ListDetectors, nargs=0, default=False, ) group_printer.add_argument( "--list-printers", help="List available printers", action=ListPrinters, nargs=0, default=False, ) group_detector.add_argument( "--exclude", help="Comma-separated list of detectors that should be excluded", action="store", dest="detectors_to_exclude", default=defaults_flag_in_config["detectors_to_exclude"], ) group_detector.add_argument( "--exclude-dependencies", help="Exclude results that are only related to dependencies", action="store_true", default=defaults_flag_in_config["exclude_dependencies"], ) group_detector.add_argument( "--exclude-optimization", help="Exclude optimization analyses", action="store_true", default=defaults_flag_in_config["exclude_optimization"], ) group_detector.add_argument( "--exclude-informational", help="Exclude informational impact analyses", action="store_true", default=defaults_flag_in_config["exclude_informational"], ) group_detector.add_argument( "--exclude-low", help="Exclude low impact analyses", action="store_true", default=defaults_flag_in_config["exclude_low"], ) group_detector.add_argument( "--exclude-medium", help="Exclude medium impact analyses", action="store_true", default=defaults_flag_in_config["exclude_medium"], ) group_detector.add_argument( "--exclude-high", help="Exclude high impact analyses", action="store_true", default=defaults_flag_in_config["exclude_high"], ) group_detector.add_argument( "--show-ignored-findings", help="Show all the findings", action="store_true", default=defaults_flag_in_config["show_ignored_findings"], ) group_misc.add_argument( "--json", help= 'Export the results as a JSON file ("--json -" to export to stdout)', action="store", default=defaults_flag_in_config["json"], ) group_misc.add_argument( "--sarif", help= 'Export the results as a SARIF JSON file ("--sarif -" to export to stdout)', action="store", default=defaults_flag_in_config["sarif"], ) group_misc.add_argument( "--json-types", help= "Comma-separated list of result types to output to JSON, defaults to " + f'{",".join(output_type for output_type in DEFAULT_JSON_OUTPUT_TYPES)}. ' + f'Available types: {",".join(output_type for output_type in JSON_OUTPUT_TYPES)}', action="store", default=defaults_flag_in_config["json-types"], ) group_misc.add_argument( "--zip", help="Export the results as a zipped JSON file", action="store", default=defaults_flag_in_config["zip"], ) group_misc.add_argument( "--zip-type", help= f'Zip compression type. One of {",".join(ZIP_TYPES_ACCEPTED.keys())}. Default lzma', action="store", default=defaults_flag_in_config["zip_type"], ) group_misc.add_argument( "--markdown-root", help="URL for markdown generation", action="store", default="", ) group_misc.add_argument( "--disable-color", help="Disable output colorization", action="store_true", default=defaults_flag_in_config["disable_color"], ) group_misc.add_argument( "--filter-paths", help="Comma-separated list of paths for which results will be excluded", action="store", dest="filter_paths", default=defaults_flag_in_config["filter_paths"], ) group_misc.add_argument( "--triage-mode", help="Run triage mode (save results in slither.db.json)", action="store_true", dest="triage_mode", default=False, ) group_misc.add_argument( "--config-file", help="Provide a config file (default: slither.config.json)", action="store", dest="config_file", default="slither.config.json", ) group_misc.add_argument( "--solc-ast", help="Provide the contract as a json AST", action="store_true", default=False, ) group_misc.add_argument( "--generate-patches", help="Generate patches (json output only)", action="store_true", default=False, ) # debugger command parser.add_argument("--debug", help=argparse.SUPPRESS, action="store_true", default=False) parser.add_argument("--markdown", help=argparse.SUPPRESS, action=OutputMarkdown, default=False) group_misc.add_argument("--checklist", help=argparse.SUPPRESS, action="store_true", default=False) group_misc.add_argument("--checklist-limit", help=argparse.SUPPRESS, action="store", default="") parser.add_argument("--wiki-detectors", help=argparse.SUPPRESS, action=OutputWiki, default=False) parser.add_argument( "--list-detectors-json", help=argparse.SUPPRESS, action=ListDetectorsJson, nargs=0, default=False, ) parser.add_argument( "--legacy-ast", help=argparse.SUPPRESS, action="store_true", default=defaults_flag_in_config["legacy_ast"], ) parser.add_argument( "--skip-assembly", help=argparse.SUPPRESS, action="store_true", default=defaults_flag_in_config["skip_assembly"], ) parser.add_argument( "--ignore-return-value", help=argparse.SUPPRESS, action="store_true", default=defaults_flag_in_config["ignore_return_value"], ) parser.add_argument( "--perf", help=argparse.SUPPRESS, action="store_true", default=False, ) # if the json is splitted in different files parser.add_argument("--splitted", help=argparse.SUPPRESS, action="store_true", default=False) # Disable the throw/catch on partial analyses parser.add_argument("--disallow-partial", help=argparse.SUPPRESS, action="store_true", default=False) if len(sys.argv) == 1: parser.print_help(sys.stderr) sys.exit(1) args = parser.parse_args() read_config_file(args) args.filter_paths = parse_filter_paths(args) # Verify our json-type output is valid args.json_types = set(args.json_types.split(",")) for json_type in args.json_types: if json_type not in JSON_OUTPUT_TYPES: raise Exception( f'Error: "{json_type}" is not a valid JSON result output type.' ) return args