Merge pull request #14323 from ethereum/stop-after-parsing-disallow-outputs-that-require-analysis

Disallow `--stop-after parsing` with CLI outputs that require analysis
This commit is contained in:
Kamil Śliwak 2023-06-14 16:02:37 +02:00 committed by GitHub
commit 25f329e4a1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 215 additions and 17 deletions

View File

@ -15,6 +15,7 @@ Compiler Features:
Bugfixes:
* Commandline Interface: Fix internal error when using ``--stop-after parsing`` and requesting some of the outputs that require full analysis or compilation.
* Commandline Interface: It is no longer possible to specify both ``--optimize-yul`` and ``--no-optimize-yul`` at the same time.
* SMTChecker: Fix encoding of side-effects inside ``if`` and ``ternary conditional``statements in the BMC engine.
* SMTChecker: Fix false negative when a verification target can be violated only by trusted external call from another public function.

View File

@ -914,9 +914,9 @@ void CommandLineInterface::handleCombinedJSON()
{
output[g_strSources][sourceCode.first] = Json::Value(Json::objectValue);
output[g_strSources][sourceCode.first]["AST"] = ASTJsonExporter(
m_compiler->state(),
m_compiler->sourceIndices()
).toJson(m_compiler->ast(sourceCode.first));
m_compiler->state(),
m_compiler->sourceIndices()
).toJson(m_compiler->ast(sourceCode.first));
output[g_strSources][sourceCode.first]["id"] = m_compiler->sourceIndices().at(sourceCode.first);
}
}

View File

@ -997,21 +997,11 @@ void CommandLineParser::processArgs()
return;
checkMutuallyExclusive({g_strColor, g_strNoColor});
checkMutuallyExclusive({g_strStopAfter, g_strGas});
array<string, 9> const conflictingWithStopAfter{
CompilerOutputs::componentName(&CompilerOutputs::binary),
CompilerOutputs::componentName(&CompilerOutputs::ir),
CompilerOutputs::componentName(&CompilerOutputs::irAstJson),
CompilerOutputs::componentName(&CompilerOutputs::irOptimized),
CompilerOutputs::componentName(&CompilerOutputs::irOptimizedAstJson),
g_strGas,
CompilerOutputs::componentName(&CompilerOutputs::asm_),
CompilerOutputs::componentName(&CompilerOutputs::asmJson),
CompilerOutputs::componentName(&CompilerOutputs::opcodes),
};
for (auto& option: conflictingWithStopAfter)
checkMutuallyExclusive({g_strStopAfter, option});
for (string const& option: CompilerOutputs::componentMap() | ranges::views::keys)
if (option != CompilerOutputs::componentName(&CompilerOutputs::astCompactJson))
checkMutuallyExclusive({g_strStopAfter, option});
if (
m_options.input.mode != InputMode::Compiler &&

View File

@ -0,0 +1 @@
--allow-paths .

View File

@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity *;
import "A";
contract C {}

View File

@ -0,0 +1,12 @@
{
"language": "Solidity",
"sources": {
"C": {"urls": ["standard_stop_after_parsing_ast_requested/in.sol"]}
},
"settings": {
"stopAfter": "parsing",
"outputSelection": {
"*": {"": ["ast"]}
}
}
}

View File

@ -0,0 +1,54 @@
{
"sources":
{
"C":
{
"ast":
{
"absolutePath": "C",
"id": 4,
"license": "GPL-3.0",
"nodeType": "SourceUnit",
"nodes":
[
{
"id": 1,
"literals":
[
"solidity",
"*"
],
"nodeType": "PragmaDirective",
"src": "36:18:0"
},
{
"absolutePath": "A",
"file": "A",
"id": 2,
"nameLocation": "-1:-1:-1",
"nodeType": "ImportDirective",
"src": "56:11:0",
"symbolAliases": [],
"unitAlias": ""
},
{
"abstract": false,
"baseContracts": [],
"contractDependencies": [],
"contractKind": "contract",
"id": 3,
"name": "C",
"nameLocation": "78:1:0",
"nodeType": "ContractDefinition",
"nodes": [],
"src": "69:13:0",
"usedErrors": [],
"usedEvents": []
}
],
"src": "36:47:0"
},
"id": 0
}
}
}

View File

@ -0,0 +1 @@
--allow-paths .

View File

@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity *;
import "A";
contract C {}

View File

@ -0,0 +1,12 @@
{
"language": "Solidity",
"sources": {
"C": {"urls": ["standard_stop_after_parsing_bytecode_requested/in.sol"]}
},
"settings": {
"stopAfter": "parsing",
"outputSelection": {
"*": {"*": ["evm.bytecode.object"]}
}
}
}

View File

@ -0,0 +1,12 @@
{
"errors":
[
{
"component": "general",
"formattedMessage": "Requested output selection conflicts with \"settings.stopAfter\".",
"message": "Requested output selection conflicts with \"settings.stopAfter\".",
"severity": "error",
"type": "JSONError"
}
]
}

View File

@ -0,0 +1 @@
--allow-paths .

View File

@ -0,0 +1,8 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity *;
import "A";
contract C {
function f() public {}
}

View File

@ -0,0 +1,19 @@
{
"language": "Solidity",
"sources": {
"C": {"urls": ["standard_stop_after_parsing_non_binary_output_requested/in.sol"]}
},
"settings": {
"stopAfter": "parsing",
"outputSelection": {
"*": {"*": [
"abi",
"devdoc",
"userdoc",
"metadata",
"storageLayout",
"evm.methodIdentifiers"
]}
}
}
}

View File

@ -0,0 +1,9 @@
{
"sources":
{
"C":
{
"id": 0
}
}
}

View File

@ -0,0 +1 @@
--pretty-json --json-indent 4 --stop-after parsing --abi

View File

@ -0,0 +1 @@
The following options are mutually exclusive: --stop-after, --abi. Select at most one.

View File

@ -0,0 +1 @@
1

View File

@ -0,0 +1,8 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity *;
import "A";
contract C {
function f() public {}
}

View File

@ -0,0 +1 @@
--pretty-json --json-indent 4 --stop-after parsing --ast-compact-json

View File

@ -0,0 +1,6 @@
// SPDX-License-Identifier: GPL-3.0
pragma solidity *;
import "A";
contract C {}

View File

@ -0,0 +1,48 @@
JSON AST (compact format):
======= stop_after_parsing_ast/input.sol =======
{
"absolutePath": "stop_after_parsing_ast/input.sol",
"id": 4,
"license": "GPL-3.0",
"nodeType": "SourceUnit",
"nodes":
[
{
"id": 1,
"literals":
[
"solidity",
"*"
],
"nodeType": "PragmaDirective",
"src": "36:18:0"
},
{
"absolutePath": "A",
"file": "A",
"id": 2,
"nameLocation": "-1:-1:-1",
"nodeType": "ImportDirective",
"src": "56:11:0",
"symbolAliases": [],
"unitAlias": ""
},
{
"abstract": false,
"baseContracts": [],
"contractDependencies": [],
"contractKind": "contract",
"id": 3,
"name": "C",
"nameLocation": "78:1:0",
"nodeType": "ContractDefinition",
"nodes": [],
"src": "69:13:0",
"usedErrors": [],
"usedEvents": []
}
],
"src": "36:47:0"
}