From b28e5c881ef2e0c2ab0666a56f386a400f976737 Mon Sep 17 00:00:00 2001 From: Midhun07 Date: Tue, 31 Aug 2021 22:27:09 +0530 Subject: [PATCH] Disallowed --error-recovery in Standard json, Assembly and Linker input modes --- Changelog.md | 1 + solc/CommandLineParser.cpp | 20 ++++++++++++----- test/solc/CommandLineParser.cpp | 39 ++++++++++++++------------------- 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Changelog.md b/Changelog.md index ddfe1648e..9aaf80f80 100644 --- a/Changelog.md +++ b/Changelog.md @@ -17,6 +17,7 @@ Bugfixes: * Commandline Interface: Fix extra newline character being appended to sources passed through standard input, affecting their hashes. * Commandline Interface: Report output selection options unsupported by the selected input mode instead of ignoring them. * Commandline Interface: Don't return zero exit code when writing linked files to disk fails. + * Commandline Interface: Disallow ``--error-recovery`` option outside of the compiler mode. * SMTChecker: Fix internal error in magic type access (``block``, ``msg``, ``tx``). * TypeChecker: Fix internal error when using user defined value types in public library functions. * Yul IR Generator: Do not output empty switches/if-bodies for empty contracts. diff --git a/solc/CommandLineParser.cpp b/solc/CommandLineParser.cpp index 89304ef3c..6b1fc1526 100644 --- a/solc/CommandLineParser.cpp +++ b/solc/CommandLineParser.cpp @@ -898,13 +898,21 @@ bool CommandLineParser::processArgs() else m_options.input.mode = InputMode::Compiler; - if ( - m_args.count(g_strExperimentalViaIR) > 0 && - m_options.input.mode != InputMode::Compiler && - m_options.input.mode != InputMode::CompilerWithASTImport - ) + map> validOptionInputModeCombinations = { + // TODO: This should eventually contain all options. + {g_strErrorRecovery, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + {g_strExperimentalViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}}, + }; + vector invalidOptionsForCurrentInputMode; + for (auto const& [optionName, inputModes]: validOptionInputModeCombinations) { - serr() << "The option --" << g_strExperimentalViaIR << " is only supported in the compiler mode." << endl; + if (m_args.count(optionName) > 0 && inputModes.count(m_options.input.mode) == 0) + invalidOptionsForCurrentInputMode.push_back(optionName); + } + + if (!invalidOptionsForCurrentInputMode.empty()) + { + serr() << "The following options are not supported in the current input mode: " << joinOptionNames(invalidOptionsForCurrentInputMode) << endl; return false; } diff --git a/test/solc/CommandLineParser.cpp b/test/solc/CommandLineParser.cpp index f2e4ea387..3b2998ce1 100644 --- a/test/solc/CommandLineParser.cpp +++ b/test/solc/CommandLineParser.cpp @@ -267,7 +267,6 @@ BOOST_AUTO_TEST_CASE(assembly_mode_options) "--include-path=/home/user/include", "--allow-paths=/tmp,/home,project,../contracts", "--ignore-missing", - "--error-recovery", // Ignored in assembly mode "--overwrite", "--evm-version=spuriousDragon", "--revert-strings=strip", // Accepted but has no effect in assembly mode @@ -356,7 +355,6 @@ BOOST_AUTO_TEST_CASE(standard_json_mode_options) "--include-path=/home/user/include", "--allow-paths=/tmp,/home,project,../contracts", "--ignore-missing", - "--error-recovery", // Ignored in Standard JSON mode "--output-dir=/tmp/out", // Accepted but has no effect in Standard JSON mode "--overwrite", // Accepted but has no effect in Standard JSON mode "--evm-version=spuriousDragon", // Ignored in Standard JSON mode @@ -413,30 +411,25 @@ BOOST_AUTO_TEST_CASE(standard_json_mode_options) BOOST_TEST(parsedOptions.value() == expectedOptions); } -BOOST_AUTO_TEST_CASE(experimental_via_ir_invalid_input_modes) +BOOST_AUTO_TEST_CASE(invalid_options_input_modes_combinations) { - static array const inputModeOptions = { - "--assemble", - "--yul", - "--strict-assembly", - "--standard-json", - "--link", + map> invalidOptionInputModeCombinations = { + // TODO: This should eventually contain all options. + {"--error-recovery", {"--assemble", "--yul", "--strict-assembly", "--standard-json", "--link"}}, + {"--experimental-via-ir", {"--assemble", "--yul", "--strict-assembly", "--standard-json", "--link"}} }; - for (string const& inputModeOption: inputModeOptions) - { - stringstream sout, serr; - vector commandLine = { - "solc", - "--experimental-via-ir", - "file", - inputModeOption, - }; - optional parsedOptions = parseCommandLine(commandLine, sout, serr); - BOOST_TEST(sout.str() == ""); - BOOST_TEST(serr.str() == "The option --experimental-via-ir is only supported in the compiler mode.\n"); - BOOST_REQUIRE(!parsedOptions.has_value()); - } + for (auto const& [optionName, inputModes]: invalidOptionInputModeCombinations) + for (string const& inputMode: inputModes) + { + stringstream sout, serr; + vector commandLine = {"solc", optionName, "file", inputMode}; + optional parsedOptions = parseCommandLine(commandLine, sout, serr); + + BOOST_TEST(sout.str() == ""); + BOOST_TEST(serr.str() == "The following options are not supported in the current input mode: " + optionName + "\n"); + BOOST_REQUIRE(!parsedOptions.has_value()); + } } BOOST_AUTO_TEST_SUITE_END()