diff --git a/slither/__main__.py b/slither/__main__.py index caaef5730..4fc83a11e 100644 --- a/slither/__main__.py +++ b/slither/__main__.py @@ -14,7 +14,7 @@ from typing import Tuple, Optional, List, Dict, Type, Union, Any, Sequence -from crytic_compile import cryticparser, CryticCompile +from crytic_compile import cryticparser, CryticCompile, InvalidCompilation from crytic_compile.platform.standard import generate_standard_export from crytic_compile.platform.etherscan import SUPPORTED_NETWORK from crytic_compile import compile_all, is_supported @@ -93,7 +93,13 @@ def process_all( detector_classes: List[Type[AbstractDetector]], printer_classes: List[Type[AbstractPrinter]], ) -> Tuple[List[Slither], List[Dict], List[Output], int]: - compilations = compile_all(target, **vars(args)) + + try: + compilations = compile_all(target, **vars(args)) + except InvalidCompilation: + logger.error("Unable to compile all targets.") + sys.exit(2) + slither_instances = [] results_detectors = [] results_printers = [] diff --git a/tests/e2e/test_cli.py b/tests/e2e/test_cli.py new file mode 100644 index 000000000..72e0441d6 --- /dev/null +++ b/tests/e2e/test_cli.py @@ -0,0 +1,20 @@ +import sys +import tempfile +import pytest + +from slither.__main__ import main_impl + + +def test_cli_exit_on_invalid_compilation_file(caplog): + + with tempfile.NamedTemporaryFile("w") as f: + f.write("pragma solidity ^0.10000.0;") + + sys.argv = ["slither", f.name] + with pytest.raises(SystemExit) as pytest_wrapped_e: + main_impl([], []) + + assert pytest_wrapped_e.type == SystemExit + assert pytest_wrapped_e.value.code == 2 + + assert caplog.record_tuples[0] == ("Slither", 40, "Unable to compile all targets.")