From 0e86f3d3045fd3669e19824ff950b160438c26c1 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 23 Jun 2023 11:23:22 -0500 Subject: [PATCH 01/29] 0.9.4 --- setup.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup.py b/setup.py index 70d4f71fd4..798d439369 100644 --- a/setup.py +++ b/setup.py @@ -8,15 +8,15 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.3", + version="0.9.4", packages=find_packages(), python_requires=">=3.8", install_requires=[ "packaging", "prettytable>=3.3.0", "pycryptodome>=3.4.6", - # "crytic-compile>=0.3.1,<0.4.0", - "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", + "crytic-compile>=0.3.2,<0.4.0", + # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", "eth-typing>=3.0.0", From 6cb36a2efdf820ca143f9c371b274659271a9889 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 26 Jun 2023 13:23:53 -0500 Subject: [PATCH 02/29] use published release of solc-select --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 798d439369..9695a8fc01 100644 --- a/setup.py +++ b/setup.py @@ -36,7 +36,7 @@ "coverage[toml]", "filelock", "pytest-insta", - "solc-select@git+https://github.com/crytic/solc-select.git@query-artifact-path#egg=solc-select", + "solc-select>=1.0.4", ], "doc": [ "pdoc", From 1f40e9269b0c3dc23d45ad2ee8e86237d266c4f9 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 27 Jun 2023 08:20:54 -0500 Subject: [PATCH 03/29] 0.9.5 --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 9695a8fc01..e7019b1aac 100644 --- a/setup.py +++ b/setup.py @@ -8,7 +8,7 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.4", + version="0.9.5", packages=find_packages(), python_requires=">=3.8", install_requires=[ From f3be9efad61672ba5e97189f73b055f7734d455a Mon Sep 17 00:00:00 2001 From: sam bacha Date: Thu, 6 Jul 2023 07:51:56 -0700 Subject: [PATCH 04/29] docs(readme): add new docs link (#2010) * docs(readme): add new docs link Fix the status badges and include a link to the documentation page that is now generated * docs(citation): create CITATION.cff This creates a `CITATION.cff` file. The information is taken from arXiv's bibtex for the whitepaper: ```bibtex @inproceedings{Feist_2019, doi = {10.1109/wetseb.2019.00008}, url = {https://doi.org/10.1109%2Fwetseb.2019.00008}, year = 2019, month = {may}, publisher = {{IEEE} }, author = {Josselin Feist and Gustavo Grieco and Alex Groce}, title = {Slither: A Static Analysis Framework for Smart Contracts}, booktitle = {2019 {IEEE}/{ACM} 2nd International Workshop on Emerging Trends in Software Engineering for Blockchain ({WETSEB})} } ``` --- CITATION.cff | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++ README.md | 60 +++++++++++++++++++++++++++++++----------------- 2 files changed, 103 insertions(+), 21 deletions(-) create mode 100644 CITATION.cff diff --git a/CITATION.cff b/CITATION.cff new file mode 100644 index 0000000000..605bd60e5f --- /dev/null +++ b/CITATION.cff @@ -0,0 +1,64 @@ +cff-version: 1.2.0 +title: Slither Analyzer +message: >- + If you use this software, please cite it using the + metadata from this file. +type: software +authors: + - given-names: Josselin + family-names: Feist + - given-names: Gustavo + family-names: Grieco + - given-names: Alex + family-names: Groce +identifiers: + - type: doi + value: 10.48550/arXiv.1908.09878 + description: arXiv.1908.09878 + - type: url + value: 'https://arxiv.org/abs/1908.09878' + description: arxiv + - type: doi + value: 10.1109/wetseb.2019.00008 +repository-code: 'https://github.com/crytic/slither' +url: 'https://www.trailofbits.com/' +repository-artifact: 'https://github.com/crytic/slither/releases' +abstract: >- + Slither is a static analysis framework designed to provide + rich information about Ethereum smart contracts. + + It works by converting Solidity smart contracts into an + intermediate representation called SlithIR. + + SlithIR uses Static Single Assignment (SSA) form and a + reduced instruction set to ease implementation of analyses + while preserving semantic information that would be lost + in transforming Solidity to bytecode. + + Slither allows for the application of commonly used + program analysis techniques like dataflow and taint + tracking. + + + Our framework has four main use cases: + + (1) automated detection of vulnerabilities, + + (2) automated detection of code optimization + opportunities, + + (3) improvement of the user's understanding of the + contracts, and + + (4) assistance with code review. +keywords: + - Ethereum + - Static Analysis + - Smart contracts + - EVM + - bug detection + - Software Engineering +license: AGPL-3.0-only +commit: 3d4f934d3228f072b7df2c5e7252c64df4601bc8 +version: 0.9.5 +date-released: '2023-06-28' diff --git a/README.md b/README.md index cb815561e8..18c1c62268 100644 --- a/README.md +++ b/README.md @@ -1,23 +1,40 @@ -# Slither, the Solidity source analyzer +Slither Static Analysis Framework Logo -Logo +# [Slither, the Solidity source analyzer](https://crytic.github.io/slither/slither.html) [![Build Status](https://img.shields.io/github/actions/workflow/status/crytic/slither/ci.yml?branch=master)](https://github.com/crytic/slither/actions?query=workflow%3ACI) -[![Slack Status](https://empireslacking.herokuapp.com/badge.svg)](https://empireslacking.herokuapp.com) -[![PyPI version](https://badge.fury.io/py/slither-analyzer.svg)](https://badge.fury.io/py/slither-analyzer) - -Slither is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. - -- [Features](#features) -- [Usage](#usage) -- [How to Install](#how-to-install) -- [Detectors](#detectors) -- [Printers](#printers) -- [Tools](#tools) -- [API Documentation](#api-documentation) -- [Getting Help](#getting-help) -- [FAQ](#faq) -- [Publications](#publications) +![PyPI](https://img.shields.io/pypi/v/slither-analyzer?logo=python&logoColor=white&label=slither-analyzer) +[![Slither - Read the Docs](https://img.shields.io/badge/Slither-Read_the_Docs-2ea44f)](https://crytic.github.io/slither/slither.html) +[![Slither - Wiki](https://img.shields.io/badge/Slither-Wiki-2ea44f)](https://github.com/crytic/slither/wiki/SlithIR) + +> Join the Empire Hacking Slack +> +> [![Slack Status](https://slack.empirehacking.nyc/badge.svg)](https://slack.empirehacking.nyc/) +> > - Discussions and Support + + +**Slither** is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. + + * [Features](#features) + * [Usage](#usage) + * [How to install](#how-to-install) + + [Using Pip](#using-pip) + + [Using Git](#using-git) + + [Using Docker](#using-docker) + + [Integration](#integration) + * [Detectors](#detectors) + * [Printers](#printers) + + [Quick Review Printers](#quick-review-printers) + + [In-Depth Review Printers](#in-depth-review-printers) + * [Tools](#tools) + * [API Documentation](#api-documentation) + * [Getting Help](#getting-help) + * [FAQ](#faq) + * [License](#license) + * [Publications](#publications) + + [Trail of Bits publication](#trail-of-bits-publication) + + [External publications](#external-publications) + ## Features @@ -36,7 +53,7 @@ Slither is a Solidity static analysis framework written in Python3. It runs a su Run Slither on a Hardhat/Foundry/Dapp/Brownie application: -```bash +```console slither . ``` @@ -44,18 +61,19 @@ This is the preferred option if your project has dependencies as Slither relies However, you can run Slither on a single file that does not import dependencies: -```bash +```console slither tests/uninitialized.sol ``` ## How to install -Slither requires Python 3.8+. +> **Note**
+> Slither requires Python 3.8+. If you're **not** going to use one of the [supported compilation frameworks](https://github.com/crytic/crytic-compile), you need [solc](https://github.com/ethereum/solidity/), the Solidity compiler; we recommend using [solc-select](https://github.com/crytic/solc-select) to conveniently switch between solc versions. ### Using Pip -```bash +```console pip3 install slither-analyzer ``` From e5f2a86f0906fd62c6c4eccb9dbfa5ab30671a78 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 6 Jul 2023 11:05:58 -0500 Subject: [PATCH 05/29] 0.9.6 (#2031) * 0.9.6 * lint readme --- README.md | 125 +++++++++++++++++++++++++++--------------------------- setup.py | 5 +-- 2 files changed, 64 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 18c1c62268..1a0d203c7d 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,51 @@ -Slither Static Analysis Framework Logo - # [Slither, the Solidity source analyzer](https://crytic.github.io/slither/slither.html) +Slither Static Analysis Framework Logo + [![Build Status](https://img.shields.io/github/actions/workflow/status/crytic/slither/ci.yml?branch=master)](https://github.com/crytic/slither/actions?query=workflow%3ACI) ![PyPI](https://img.shields.io/pypi/v/slither-analyzer?logo=python&logoColor=white&label=slither-analyzer) [![Slither - Read the Docs](https://img.shields.io/badge/Slither-Read_the_Docs-2ea44f)](https://crytic.github.io/slither/slither.html) [![Slither - Wiki](https://img.shields.io/badge/Slither-Wiki-2ea44f)](https://github.com/crytic/slither/wiki/SlithIR) > Join the Empire Hacking Slack -> +> > [![Slack Status](https://slack.empirehacking.nyc/badge.svg)](https://slack.empirehacking.nyc/) > > - Discussions and Support - **Slither** is a Solidity static analysis framework written in Python3. It runs a suite of vulnerability detectors, prints visual information about contract details, and provides an API to easily write custom analyses. Slither enables developers to find vulnerabilities, enhance their code comprehension, and quickly prototype custom analyses. - * [Features](#features) - * [Usage](#usage) - * [How to install](#how-to-install) - + [Using Pip](#using-pip) - + [Using Git](#using-git) - + [Using Docker](#using-docker) - + [Integration](#integration) - * [Detectors](#detectors) - * [Printers](#printers) - + [Quick Review Printers](#quick-review-printers) - + [In-Depth Review Printers](#in-depth-review-printers) - * [Tools](#tools) - * [API Documentation](#api-documentation) - * [Getting Help](#getting-help) - * [FAQ](#faq) - * [License](#license) - * [Publications](#publications) - + [Trail of Bits publication](#trail-of-bits-publication) - + [External publications](#external-publications) - +* [Features](#features) +* [Usage](#usage) +* [How to install](#how-to-install) + * [Using Pip](#using-pip) + * [Using Git](#using-git) + * [Using Docker](#using-docker) + * [Integration](#integration) +* [Detectors](#detectors) +* [Printers](#printers) + * [Quick Review Printers](#quick-review-printers) + * [In-Depth Review Printers](#in-depth-review-printers) +* [Tools](#tools) +* [API Documentation](#api-documentation) +* [Getting Help](#getting-help) +* [FAQ](#faq) +* [License](#license) +* [Publications](#publications) + * [Trail of Bits publication](#trail-of-bits-publication) + * [External publications](#external-publications) ## Features -- Detects vulnerable Solidity code with low false positives (see the list of [trophies](./trophies.md)) -- Identifies where the error condition occurs in the source code -- Easily integrates into continuous integration and Hardhat/Foundry builds -- Built-in 'printers' quickly report crucial contract information -- Detector API to write custom analyses in Python -- Ability to analyze contracts written with Solidity >= 0.4 -- Intermediate representation ([SlithIR](https://github.com/trailofbits/slither/wiki/SlithIR)) enables simple, high-precision analyses -- Correctly parses 99.9% of all public Solidity code -- Average execution time of less than 1 second per contract -- Integrates with Github's code scanning in [CI](https://github.com/marketplace/actions/slither-action) +* Detects vulnerable Solidity code with low false positives (see the list of [trophies](./trophies.md)) +* Identifies where the error condition occurs in the source code +* Easily integrates into continuous integration and Hardhat/Foundry builds +* Built-in 'printers' quickly report crucial contract information +* Detector API to write custom analyses in Python +* Ability to analyze contracts written with Solidity >= 0.4 +* Intermediate representation ([SlithIR](https://github.com/trailofbits/slither/wiki/SlithIR)) enables simple, high-precision analyses +* Correctly parses 99.9% of all public Solidity code +* Average execution time of less than 1 second per contract +* Integrates with Github's code scanning in [CI](https://github.com/marketplace/actions/slither-action) ## Usage @@ -102,9 +100,9 @@ docker run -it -v /home/share:/share trailofbits/eth-security-toolbox ### Integration -- For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). -- To generate a Markdown report, use `slither [target] --checklist`. -- To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) +* For GitHub action integration, use [slither-action](https://github.com/marketplace/actions/slither-action). +* To generate a Markdown report, use `slither [target] --checklist`. +* To generate a Markdown with GitHub source code highlighting, use `slither [target] --checklist --markdown-root https://github.com/ORG/REPO/blob/COMMIT/` (replace `ORG`, `REPO`, `COMMIT`) ## Detectors @@ -200,23 +198,24 @@ Num | Detector | What it Detects | Impact | Confidence For more information, see -- The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector -- The [Detection Selection](https://github.com/crytic/slither/wiki/Usage#detector-selection) to run only selected detectors. By default, all the detectors are run. -- The [Triage Mode](https://github.com/crytic/slither/wiki/Usage#triage-mode) to filter individual results +* The [Detector Documentation](https://github.com/crytic/slither/wiki/Detector-Documentation) for details on each detector +* The [Detection Selection](https://github.com/crytic/slither/wiki/Usage#detector-selection) to run only selected detectors. By default, all the detectors are run. +* The [Triage Mode](https://github.com/crytic/slither/wiki/Usage#triage-mode) to filter individual results ## Printers + ### Quick Review Printers -- `human-summary`: [Print a human-readable summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#human-summary) -- `inheritance-graph`: [Export the inheritance graph of each contract to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) -- `contract-summary`: [Print a summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#contract-summary) -- `loc`: [Count the total number lines of code (LOC), source lines of code (SLOC), and comment lines of code (CLOC) found in source files (SRC), dependencies (DEP), and test files (TEST).](https://github.com/trailofbits/slither/wiki/Printer-documentation#loc) +* `human-summary`: [Print a human-readable summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#human-summary) +* `inheritance-graph`: [Export the inheritance graph of each contract to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#inheritance-graph) +* `contract-summary`: [Print a summary of the contracts](https://github.com/trailofbits/slither/wiki/Printer-documentation#contract-summary) +* `loc`: [Count the total number lines of code (LOC), source lines of code (SLOC), and comment lines of code (CLOC) found in source files (SRC), dependencies (DEP), and test files (TEST).](https://github.com/trailofbits/slither/wiki/Printer-documentation#loc) ### In-Depth Review Printers -- `call-graph`: [Export the call-graph of the contracts to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#call-graph) -- `cfg`: [Export the CFG of each functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#cfg) -- `function-summary`: [Print a summary of the functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) -- `vars-and-auth`: [Print the state variables written and the authorization of the functions](https://github.com/crytic/slither/wiki/Printer-documentation#variables-written-and-authorization) -- `not-pausable`: [Print functions that do not use `whenNotPaused` modifier](https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused). +* `call-graph`: [Export the call-graph of the contracts to a dot file](https://github.com/trailofbits/slither/wiki/Printer-documentation#call-graph) +* `cfg`: [Export the CFG of each functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#cfg) +* `function-summary`: [Print a summary of the functions](https://github.com/trailofbits/slither/wiki/Printer-documentation#function-summary) +* `vars-and-auth`: [Print the state variables written and the authorization of the functions](https://github.com/crytic/slither/wiki/Printer-documentation#variables-written-and-authorization) +* `not-pausable`: [Print functions that do not use `whenNotPaused` modifier](https://github.com/trailofbits/slither/wiki/Printer-documentation#when-not-paused). To run a printer, use `--print` and a comma-separated list of printers. @@ -224,13 +223,13 @@ See the [Printer documentation](https://github.com/crytic/slither/wiki/Printer-d ## Tools -- `slither-check-upgradeability`: [Review `delegatecall`-based upgradeability](https://github.com/crytic/slither/wiki/Upgradeability-Checks) -- `slither-prop`: [Automatic unit test and property generation](https://github.com/crytic/slither/wiki/Property-generation) -- `slither-flat`: [Flatten a codebase](https://github.com/crytic/slither/wiki/Contract-Flattening) -- `slither-check-erc`: [Check the ERC's conformance](https://github.com/crytic/slither/wiki/ERC-Conformance) -- `slither-format`: [Automatic patch generation](https://github.com/crytic/slither/wiki/Slither-format) -- `slither-read-storage`: [Read storage values from contracts](./slither/tools/read_storage/README.md) -- `slither-interface`: [Generate an interface for a contract](./slither/tools/interface/README.md) +* `slither-check-upgradeability`: [Review `delegatecall`-based upgradeability](https://github.com/crytic/slither/wiki/Upgradeability-Checks) +* `slither-prop`: [Automatic unit test and property generation](https://github.com/crytic/slither/wiki/Property-generation) +* `slither-flat`: [Flatten a codebase](https://github.com/crytic/slither/wiki/Contract-Flattening) +* `slither-check-erc`: [Check the ERC's conformance](https://github.com/crytic/slither/wiki/ERC-Conformance) +* `slither-format`: [Automatic patch generation](https://github.com/crytic/slither/wiki/Slither-format) +* `slither-read-storage`: [Read storage values from contracts](./slither/tools/read_storage/README.md) +* `slither-interface`: [Generate an interface for a contract](./slither/tools/interface/README.md) See the [Tool documentation](https://github.com/crytic/slither/wiki/Tool-Documentation) for additional tools. @@ -244,23 +243,23 @@ Documentation on Slither's internals is available [here](https://crytic.github.i Feel free to stop by our [Slack channel](https://empireslacking.herokuapp.com) (#ethereum) for help using or extending Slither. -- The [Printer documentation](https://github.com/trailofbits/slither/wiki/Printer-documentation) describes the information Slither is capable of visualizing for each contract. +* The [Printer documentation](https://github.com/trailofbits/slither/wiki/Printer-documentation) describes the information Slither is capable of visualizing for each contract. -- The [Detector documentation](https://github.com/trailofbits/slither/wiki/Adding-a-new-detector) describes how to write a new vulnerability analyses. +* The [Detector documentation](https://github.com/trailofbits/slither/wiki/Adding-a-new-detector) describes how to write a new vulnerability analyses. -- The [API documentation](https://github.com/crytic/slither/wiki/Python-API) describes the methods and objects available for custom analyses. +* The [API documentation](https://github.com/crytic/slither/wiki/Python-API) describes the methods and objects available for custom analyses. -- The [SlithIR documentation](https://github.com/trailofbits/slither/wiki/SlithIR) describes the SlithIR intermediate representation. +* The [SlithIR documentation](https://github.com/trailofbits/slither/wiki/SlithIR) describes the SlithIR intermediate representation. ## FAQ How do I exclude mocks or tests? -- View our documentation on [path filtering](https://github.com/crytic/slither/wiki/Usage#path-filtering). +* View our documentation on [path filtering](https://github.com/crytic/slither/wiki/Usage#path-filtering). How do I fix "unknown file" or compilation issues? -- Because slither requires the solc AST, it must have all dependencies available. +* Because slither requires the solc AST, it must have all dependencies available. If a contract has dependencies, `slither contract.sol` will fail. Instead, use `slither .` in the parent directory of `contracts/` (you should see `contracts/` when you run `ls`). If you have a `node_modules/` folder, it must be in the same directory as `contracts/`. To verify that this issue is related to slither, @@ -275,7 +274,7 @@ Slither is licensed and distributed under the AGPLv3 license. [Contact us](mailt ### Trail of Bits publication -- [Slither: A Static Analysis Framework For Smart Contracts](https://arxiv.org/abs/1908.09878), Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19 +* [Slither: A Static Analysis Framework For Smart Contracts](https://arxiv.org/abs/1908.09878), Josselin Feist, Gustavo Grieco, Alex Groce - WETSEB '19 ### External publications diff --git a/setup.py b/setup.py index e7019b1aac..182b91d35b 100644 --- a/setup.py +++ b/setup.py @@ -8,14 +8,14 @@ description="Slither is a Solidity static analysis framework written in Python 3.", url="https://github.com/crytic/slither", author="Trail of Bits", - version="0.9.5", + version="0.9.6", packages=find_packages(), python_requires=">=3.8", install_requires=[ "packaging", "prettytable>=3.3.0", "pycryptodome>=3.4.6", - "crytic-compile>=0.3.2,<0.4.0", + "crytic-compile>=0.3.3,<0.4.0", # "crytic-compile@git+https://github.com/crytic/crytic-compile.git@dev#egg=crytic-compile", "web3>=6.0.0", "eth-abi>=4.0.0", @@ -36,7 +36,6 @@ "coverage[toml]", "filelock", "pytest-insta", - "solc-select>=1.0.4", ], "doc": [ "pdoc", From 97f817712fbe35d5d118cf1caa54075f9d660528 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 10 Jul 2023 22:35:07 +0000 Subject: [PATCH 06/29] Bump actions/upload-pages-artifact from 1 to 2 Bumps [actions/upload-pages-artifact](https://github.com/actions/upload-pages-artifact) from 1 to 2. - [Release notes](https://github.com/actions/upload-pages-artifact/releases) - [Commits](https://github.com/actions/upload-pages-artifact/compare/v1...v2) --- updated-dependencies: - dependency-name: actions/upload-pages-artifact dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index f6d66aa0a0..625cafe4f0 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -37,7 +37,7 @@ jobs: - run: pip install -e ".[doc]" - run: pdoc -o html/ slither '!slither.tools' #TODO fix import errors on pdoc run - name: Upload artifact - uses: actions/upload-pages-artifact@v1 + uses: actions/upload-pages-artifact@v2 with: # Upload the doc path: './html/' From 65aaafa0c61f1b5dd8c8ce15e945bae3eebf12c5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 17 Jul 2023 22:38:31 +0000 Subject: [PATCH 07/29] Bump pypa/gh-action-pypi-publish from 1.8.7 to 1.8.8 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.7 to 1.8.8. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.7...v1.8.8) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index f7d9ff9e7b..24f04ee87b 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -44,7 +44,7 @@ jobs: path: dist/ - name: publish - uses: pypa/gh-action-pypi-publish@v1.8.7 + uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign uses: sigstore/gh-action-sigstore-python@v1.2.3 From 60a67680b06ec21311158a115f4d4a7d97a678cc Mon Sep 17 00:00:00 2001 From: Simone Date: Tue, 18 Jul 2023 14:07:51 +0200 Subject: [PATCH 08/29] Compile after the test was added --- CONTRIBUTING.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 5cf02136bd..ae7951c7f9 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -96,8 +96,8 @@ For each new detector, at least one regression tests must be present. #### Adding parsing tests 1. Create a test in `tests/e2e/solc_parsing/` -2. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --compile`. This will compile the artifact in `tests/e2e/solc_parsing/compile`. Add the compiled artifact to git. -3. Update `ALL_TESTS` in `tests/e2e/solc_parsing/test_ast_parsing.py`. +2. Update `ALL_TESTS` in `tests/e2e/solc_parsing/test_ast_parsing.py`. +3. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --compile`. This will compile the artifact in `tests/e2e/solc_parsing/compile`. Add the compiled artifact to git. 4. Run `python tests/e2e/solc_parsing/test_ast_parsing.py --generate`. This will generate the json artifacts in `tests/e2e/solc_parsing/expected_json`. Add the generated files to git. 5. Run `pytest tests/e2e/solc_parsing/test_ast_parsing.py` and check that everything worked. From c47fa62b712af745cecbb0f20329d567c24affff Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Fri, 28 Jul 2023 17:36:04 -0500 Subject: [PATCH 09/29] ci: add problem matchers for yamllint and pylint --- .github/workflows/linter.yml | 7 +++--- .github/workflows/matchers/pylint.json | 32 ++++++++++++++++++++++++ .github/workflows/matchers/yamllint.json | 22 ++++++++++++++++ .github/workflows/pylint.yml | 6 +++++ 4 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/matchers/pylint.json create mode 100644 .github/workflows/matchers/yamllint.json diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index b352a8301d..0468b07f8a 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -9,8 +9,6 @@ defaults: on: pull_request: branches: [master, dev] - paths: - - "**/*.py" schedule: # run CI every day even if no PRs/merges occur @@ -42,6 +40,10 @@ jobs: mkdir -p .github/linters cp pyproject.toml .github/linters + - name: Register yamllint problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/yamllint.json" + - name: Lint everything else uses: super-linter/super-linter/slim@v4.9.2 if: always() @@ -55,7 +57,6 @@ jobs: VALIDATE_PYTHON_PYLINT: false VALIDATE_PYTHON_BLACK: false VALIDATE_PYTHON_ISORT: false - # Always false VALIDATE_JSON: false VALIDATE_JAVASCRIPT_STANDARD: false VALIDATE_PYTHON_FLAKE8: false diff --git a/.github/workflows/matchers/pylint.json b/.github/workflows/matchers/pylint.json new file mode 100644 index 0000000000..4d9e13fca7 --- /dev/null +++ b/.github/workflows/matchers/pylint.json @@ -0,0 +1,32 @@ +{ + "problemMatcher": [ + { + "owner": "pylint-error", + "severity": "error", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([EF]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + }, + { + "owner": "pylint-warning", + "severity": "warning", + "pattern": [ + { + "regexp": "^(.+):(\\d+):(\\d+):\\s(([CRW]\\d{4}):\\s.+)$", + "file": 1, + "line": 2, + "column": 3, + "message": 4, + "code": 5 + } + ] + } + ] +} \ No newline at end of file diff --git a/.github/workflows/matchers/yamllint.json b/.github/workflows/matchers/yamllint.json new file mode 100644 index 0000000000..b0b2f125c6 --- /dev/null +++ b/.github/workflows/matchers/yamllint.json @@ -0,0 +1,22 @@ +{ + "problemMatcher": [ + { + "owner": "yamllint", + "pattern": [ + { + "regexp": "^(.*\\.ya?ml)$", + "file": 1 + }, + { + "regexp": "^\\s{2}(\\d+):(\\d+)\\s+(error|warning)\\s+(.*?)\\s+\\((.*)\\)$", + "line": 1, + "column": 2, + "severity": 3, + "message": 4, + "code": 5, + "loop": true + } + ] + } + ] + } \ No newline at end of file diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 207f98eac0..8c7e7bce93 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -9,6 +9,8 @@ defaults: on: pull_request: branches: [master, dev] + paths: + - "**/*.py" concurrency: group: ${{ github.workflow }}-${{ github.ref }} @@ -36,6 +38,10 @@ jobs: mkdir -p .github/linters cp pyproject.toml .github/linters + - name: Register pylint problem matcher + run: | + echo "::add-matcher::.github/workflows/matchers/pylint.json" + - name: Pylint uses: super-linter/super-linter/slim@v4.9.2 if: always() From d90505826f952526f5daccd107b4100ed44ab2cb Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 3 Aug 2023 16:51:49 -0500 Subject: [PATCH 10/29] fix ternary rewrite test and make assertion more strict (#2067) --- .../unit/slithir/test_ternary_expressions.py | 55 +++++++++++-------- 1 file changed, 31 insertions(+), 24 deletions(-) diff --git a/tests/unit/slithir/test_ternary_expressions.py b/tests/unit/slithir/test_ternary_expressions.py index 0acd9345d7..712c9582b0 100644 --- a/tests/unit/slithir/test_ternary_expressions.py +++ b/tests/unit/slithir/test_ternary_expressions.py @@ -1,8 +1,13 @@ from pathlib import Path from slither import Slither from slither.core.cfg.node import NodeType -from slither.slithir.operations import Assignment -from slither.core.expressions import AssignmentOperation, TupleExpression +from slither.slithir.operations import Assignment, Unpack +from slither.core.expressions import ( + AssignmentOperation, + TupleExpression, + NewElementaryType, + CallExpression, +) TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" @@ -12,27 +17,29 @@ def test_ternary_conversions(solc_binary_path) -> None: solc_path = solc_binary_path("0.8.0") slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) for contract in slither.contracts: - for function in contract.functions: - vars_declared = 0 - vars_assigned = 0 - for node in function.nodes: - if node.type in [NodeType.IF, NodeType.IFLOOP]: + if not contract.is_signature_only: + for function in contract.functions: + vars_declared = 0 + vars_assigned = 0 + for node in function.nodes: + if node.type in [NodeType.IF, NodeType.IFLOOP]: - # Iterate over true and false son - for inner_node in node.sons: - # Count all variables declared - expression = inner_node.expression - if isinstance(expression, AssignmentOperation): - var_expr = expression.expression_left - # Only tuples declare more than one var - if isinstance(var_expr, TupleExpression): - vars_declared += len(var_expr.expressions) - else: - vars_declared += 1 + # Iterate over true and false son + for inner_node in node.sons: + # Count all variables declared + expression = inner_node.expression + if isinstance( + expression, (AssignmentOperation, NewElementaryType, CallExpression) + ): + var_expr = expression.expression_left + # Only tuples declare more than one var + if isinstance(var_expr, TupleExpression): + vars_declared += len(var_expr.expressions) + else: + vars_declared += 1 - for ir in inner_node.irs: - # Count all variables defined - if isinstance(ir, Assignment): - vars_assigned += 1 - - assert vars_declared == vars_assigned + for ir in inner_node.irs: + # Count all variables defined + if isinstance(ir, (Assignment, Unpack)): + vars_assigned += 1 + assert vars_declared == vars_assigned and vars_assigned != 0 From e0098907c998fede544525f859f917074a752e63 Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Thu, 3 Aug 2023 23:53:09 +0200 Subject: [PATCH 11/29] Add CustomError as printable output (#2063) --- slither/core/declarations/__init__.py | 2 ++ .../declarations/custom_error_contract.py | 4 +++ .../declarations/custom_error_top_level.py | 4 +++ slither/utils/output.py | 29 +++++++++++++++++++ 4 files changed, 39 insertions(+) diff --git a/slither/core/declarations/__init__.py b/slither/core/declarations/__init__.py index 92e0b9eca3..f341187518 100644 --- a/slither/core/declarations/__init__.py +++ b/slither/core/declarations/__init__.py @@ -18,3 +18,5 @@ from .function_contract import FunctionContract from .function_top_level import FunctionTopLevel from .custom_error_contract import CustomErrorContract +from .custom_error_top_level import CustomErrorTopLevel +from .custom_error import CustomError diff --git a/slither/core/declarations/custom_error_contract.py b/slither/core/declarations/custom_error_contract.py index cd279a3a62..2c8bec9efa 100644 --- a/slither/core/declarations/custom_error_contract.py +++ b/slither/core/declarations/custom_error_contract.py @@ -16,3 +16,7 @@ def is_declared_by(self, contract: "Contract") -> bool: :return: """ return self.contract == contract + + @property + def canonical_name(self) -> str: + return self.contract.name + "." + self.full_name diff --git a/slither/core/declarations/custom_error_top_level.py b/slither/core/declarations/custom_error_top_level.py index 64a6a85353..b80356b245 100644 --- a/slither/core/declarations/custom_error_top_level.py +++ b/slither/core/declarations/custom_error_top_level.py @@ -12,3 +12,7 @@ class CustomErrorTopLevel(CustomError, TopLevel): def __init__(self, compilation_unit: "SlitherCompilationUnit", scope: "FileScope") -> None: super().__init__(compilation_unit) self.file_scope: "FileScope" = scope + + @property + def canonical_name(self) -> str: + return self.full_name diff --git a/slither/utils/output.py b/slither/utils/output.py index 84c9ac65a1..4a91ca9b9b 100644 --- a/slither/utils/output.py +++ b/slither/utils/output.py @@ -18,6 +18,7 @@ Structure, Pragma, FunctionContract, + CustomError, ) from slither.core.source_mapping.source_mapping import SourceMapping from slither.core.variables.local_variable import LocalVariable @@ -438,6 +439,8 @@ def add(self, add: SupportedOutput, additional_fields: Optional[Dict] = None) -> self.add_event(add, additional_fields=additional_fields) elif isinstance(add, Structure): self.add_struct(add, additional_fields=additional_fields) + elif isinstance(add, CustomError): + self.add_custom_error(add, additional_fields=additional_fields) elif isinstance(add, Pragma): self.add_pragma(add, additional_fields=additional_fields) elif isinstance(add, Node): @@ -585,6 +588,32 @@ def add_event(self, event: Event, additional_fields: Optional[Dict] = None) -> N self._data["elements"].append(element) + # endregion + ################################################################################### + ################################################################################### + # region CustomError + ################################################################################### + ################################################################################### + + def add_custom_error( + self, custom_error: CustomError, additional_fields: Optional[Dict] = None + ) -> None: + if additional_fields is None: + additional_fields = {} + type_specific_fields = { + "parent": _create_parent_element(custom_error), + "signature": custom_error.full_name, + } + element = _create_base_element( + "custom_error", + custom_error.name, + custom_error.source_mapping.to_json(), + type_specific_fields, + additional_fields, + ) + + self._data["elements"].append(element) + # endregion ################################################################################### ################################################################################### From d86bd4109d69f7e99ea84e716f7d41d9ac29b1ea Mon Sep 17 00:00:00 2001 From: SheldonHolmgren <116484297+SheldonHolmgren@users.noreply.github.com> Date: Thu, 3 Aug 2023 22:54:15 +0100 Subject: [PATCH 12/29] UnaryOperation: -variable and +variable doesn't make variable an lvalue (#2027) --- slither/core/expressions/unary_operation.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/slither/core/expressions/unary_operation.py b/slither/core/expressions/unary_operation.py index 6572249278..4051326131 100644 --- a/slither/core/expressions/unary_operation.py +++ b/slither/core/expressions/unary_operation.py @@ -106,8 +106,6 @@ def __init__( UnaryOperationType.MINUSMINUS_PRE, UnaryOperationType.PLUSPLUS_POST, UnaryOperationType.MINUSMINUS_POST, - UnaryOperationType.PLUS_PRE, - UnaryOperationType.MINUS_PRE, ]: expression.set_lvalue() From 3f90e86badfa956b5cc692e0421c2b8065c31d43 Mon Sep 17 00:00:00 2001 From: yisun92 Date: Thu, 3 Aug 2023 17:56:04 -0400 Subject: [PATCH 13/29] fix: get_state_variable_from_canonical_name() filter by canonical_name (#1983) --- slither/core/declarations/contract.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index fd2cdd4684..9b1488db31 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -861,7 +861,7 @@ def get_state_variable_from_canonical_name( Returns: StateVariable """ - return next((v for v in self.state_variables if v.name == canonical_name), None) + return next((v for v in self.state_variables if v.canonical_name == canonical_name), None) def get_structure_from_name(self, structure_name: str) -> Optional["StructureContract"]: """ From 4b0482014dbf911f886a5f1221260ccb71a7cd22 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Tue, 8 Aug 2023 10:01:12 -0500 Subject: [PATCH 14/29] chore: bump sigstore to 2.0.0 (#2081) --- .github/workflows/publish.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 24f04ee87b..977a92ab21 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,8 +47,7 @@ jobs: uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign - uses: sigstore/gh-action-sigstore-python@v1.2.3 + uses: sigstore/gh-action-sigstore-python@v2.0.0 with: inputs: ./dist/*.tar.gz ./dist/*.whl release-signing-artifacts: true - bundle-only: true From 2bc6a0f1a4349e2cb6a45bf7a078f65e050d7e28 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:22:08 +0000 Subject: [PATCH 15/29] Bump pypa/gh-action-pypi-publish from 1.8.8 to 1.8.10 Bumps [pypa/gh-action-pypi-publish](https://github.com/pypa/gh-action-pypi-publish) from 1.8.8 to 1.8.10. - [Release notes](https://github.com/pypa/gh-action-pypi-publish/releases) - [Commits](https://github.com/pypa/gh-action-pypi-publish/compare/v1.8.8...v1.8.10) --- updated-dependencies: - dependency-name: pypa/gh-action-pypi-publish dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 977a92ab21..ed11178e37 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -44,7 +44,7 @@ jobs: path: dist/ - name: publish - uses: pypa/gh-action-pypi-publish@v1.8.8 + uses: pypa/gh-action-pypi-publish@v1.8.10 - name: sign uses: sigstore/gh-action-sigstore-python@v2.0.0 From 81c0c8cd88a437f39fa6aece06470f7e8c1b1a31 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 14 Aug 2023 22:22:13 +0000 Subject: [PATCH 16/29] Bump sigstore/gh-action-sigstore-python from 2.0.0 to 2.0.1 Bumps [sigstore/gh-action-sigstore-python](https://github.com/sigstore/gh-action-sigstore-python) from 2.0.0 to 2.0.1. - [Release notes](https://github.com/sigstore/gh-action-sigstore-python/releases) - [Commits](https://github.com/sigstore/gh-action-sigstore-python/compare/v2.0.0...v2.0.1) --- updated-dependencies: - dependency-name: sigstore/gh-action-sigstore-python dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- .github/workflows/publish.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 977a92ab21..cd6feacceb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -47,7 +47,7 @@ jobs: uses: pypa/gh-action-pypi-publish@v1.8.8 - name: sign - uses: sigstore/gh-action-sigstore-python@v2.0.0 + uses: sigstore/gh-action-sigstore-python@v2.0.1 with: inputs: ./dist/*.tar.gz ./dist/*.whl release-signing-artifacts: true From ff52901e6d1240fcd6633e5cee59577226adde66 Mon Sep 17 00:00:00 2001 From: joodiewoodo <38355190+dokzai@users.noreply.github.com> Date: Thu, 7 Sep 2023 23:03:56 -0400 Subject: [PATCH 17/29] Allow underscore in variable naming convention for internal state variables (#2110) * fix: allow underscore in variable naming convention for internal state variables and update test_detector tests snapshot * change set visibility of _myPublic to public, update test snapshots --- .../naming_convention/naming_convention.py | 2 +- ...ention_0_4_25_naming_convention_sol__0.txt | 14 +++++++------- ...ention_0_5_16_naming_convention_sol__0.txt | 14 +++++++------- ...ention_0_6_11_naming_convention_sol__0.txt | 14 +++++++------- ...vention_0_7_6_naming_convention_sol__0.txt | 14 +++++++------- .../0.4.25/naming_convention.sol | 3 ++- .../0.4.25/naming_convention.sol-0.4.25.zip | Bin 3545 -> 3659 bytes ...arning_for_public_constants.sol-0.4.25.zip | Bin 1377 -> 1380 bytes .../0.5.16/naming_convention.sol | 3 ++- .../0.5.16/naming_convention.sol-0.5.16.zip | Bin 3563 -> 3671 bytes ...arning_for_public_constants.sol-0.5.16.zip | Bin 1382 -> 1387 bytes .../0.6.11/naming_convention.sol | 3 ++- .../0.6.11/naming_convention.sol-0.6.11.zip | Bin 3566 -> 3688 bytes ...arning_for_public_constants.sol-0.6.11.zip | Bin 1402 -> 1409 bytes .../0.7.6/naming_convention.sol | 3 ++- .../0.7.6/naming_convention.sol-0.7.6.zip | Bin 3481 -> 3605 bytes ...warning_for_public_constants.sol-0.7.6.zip | Bin 1357 -> 1367 bytes 17 files changed, 37 insertions(+), 33 deletions(-) diff --git a/slither/detectors/naming_convention/naming_convention.py b/slither/detectors/naming_convention/naming_convention.py index 02deb719e7..0633799e56 100644 --- a/slither/detectors/naming_convention/naming_convention.py +++ b/slither/detectors/naming_convention/naming_convention.py @@ -167,7 +167,7 @@ def _detect(self) -> List[Output]: results.append(res) else: - if var.visibility == "private": + if var.visibility in ["private", "internal"]: correct_naming = self.is_mixed_case_with_underscore(var.name) else: correct_naming = self.is_mixed_case(var.name) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt index ed4177ca17..e4a643678d 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_4_25_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.4.25 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt index 35c11193f5..96f6aab3c6 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_5_16_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.5.16 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.5.16/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt index f692e211b8..f1986fb781 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_6_11_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_c Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.6.11 Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt index af17cabe8f..b471cbfa2f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_NamingConvention_0_7_6_naming_convention_sol__0.txt @@ -1,10 +1,10 @@ Struct naming.test (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#14-16) is not in CapWords -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is not in mixedCase +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is not in mixedCase -Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is single letter l, O, or I, which should not be used +Variable T.I (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#70) is single letter l, O, or I, which should not be used -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is not in mixedCase +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is not in mixedCase Variable naming.Var_One (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#11) is not in mixedCase @@ -14,11 +14,11 @@ Contract naming (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_co Enum naming.numbers (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#6) is not in CapWords -Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#59) is not in mixedCase +Parameter T.test(uint256,uint256)._used (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#60) is not in mixedCase -Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#56) is not in mixedCase +Variable T._myPublicVar (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#57) is not in mixedCase -Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is single letter l, O, or I, which should not be used +Variable T.O (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#69) is single letter l, O, or I, which should not be used Event naming.event_(uint256) (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#23) is not in CapWords @@ -26,7 +26,7 @@ Modifier naming.CantDo() (tests/e2e/detectors/test_data/naming-convention/0.7.6/ Function naming.GetOne() (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#30-33) is not in mixedCase -Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#67) is single letter l, O, or I, which should not be used +Variable T.l (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#68) is single letter l, O, or I, which should not be used Parameter naming.setInt(uint256,uint256).Number2 (tests/e2e/detectors/test_data/naming-convention/0.7.6/naming_convention.sol#35) is not in mixedCase diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol index 7181ca9110..add7867e07 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol @@ -53,7 +53,8 @@ contract Test { contract T { uint private _myPrivateVar; - uint _myPublicVar; + uint internal _myInternalVar; + uint public _myPublicVar; function test(uint _unused, uint _used) public returns(uint){ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip b/tests/e2e/detectors/test_data/naming-convention/0.4.25/naming_convention.sol-0.4.25.zip index c7aaae071dbf8633c6c3ccd451a16b70b9ddd938..fe35f0c006f2a1526c143d8def79ef54a25e15c3 100644 GIT binary patch delta 3541 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 delta 1213 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 delta 3444 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 diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol index 7181ca9110..add7867e07 100644 --- a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol +++ b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol @@ -53,7 +53,8 @@ contract Test { contract T { uint private _myPrivateVar; - uint _myPublicVar; + uint internal _myInternalVar; + uint public _myPublicVar; function test(uint _unused, uint _used) public returns(uint){ diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/naming_convention.sol-0.6.11.zip index 3e6277ac1b0975ae85638b853cbde20646ccd7d2..b91697087411d7fed7effcb98875fdbf53f7a74f 100644 GIT binary patch delta 3577 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 ZR_r<*r#cM)0BC)a6%I`Xfeiov0078)u@wLS diff --git a/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip b/tests/e2e/detectors/test_data/naming-convention/0.6.11/no_warning_for_public_constants.sol-0.6.11.zip index 67f8eff7ee737a57bf2ee1036db7d482c4926445..ed813d07b9be8e890dcdba4f865b432c1a77860b 100644 GIT binary patch delta 1245 zcmV<31S0$T3V{n4P)h>@KL7#%4ghJHCs+1C%$%_V006iTkr-fqO_*8QcqqqPRb~nJ zWXL2H807psVK9!fD&p|6=0Ku$knG4&vYB3y^^P$vjeL2gg{xK7S=SBtKOl888a$}y z?7meBGBj`~m&-#p=E9&=Y#IZ!d=kIw6mvH2#t-Bf3L+x|hA9LYtG{(*ZO9he`Pt%@ z99+AjzSX&+R+e}~Xj(A3cl383y=mPAtt?kF!S3%I z%x>Iof-%-1gqi30R7jx=7s^%4s@M{t*PZ_xP0M7F4PG z$!m5QoXiRjj)H&uA{a$6bX|c_&6y`Ox#Tc{!Qd|)H#t~;eF>ONb4~ju`Zz&?pRDj8i|yex+5G`u4?t)Lpd~j9^S}rh9Cp#k;jGJ=b_f z_)qqQ?E!RuMDQ$$Wj=608lsSFpFu*}Cmk+?qv~{lu>s>ST}?DCvf{ns3R&${S;Opk zaI50}CpU47&(DSJMXyygN@c`0&}jO~HN|7%tOPX5Xj{=caw1qO(jRGxlugKS|a+h^9SH*e8%p80gO6 z{|tYB&Ad&-m=TpI)$G!%ERM4mZi?038GgP_Z>ArmSEw>nF!?nMFwvgCx{)F;i^sd7 zFrWp&_P4Uf={&* z-vteL16V!4rhf?{1wB9TN4kswUJ-yW^7}FJK>~p3MfhVdB-H{+>TCKGInZ1H2_Ijx|D*!IiJA6vAfSJ575h_&=kFY zxYUpF`V6GD=sf$=Heix76~07<21Gc?gCyE+jRcCjsG%ypjKe12u_@*1-XT|K+$SUc zjGXF60_xFe3BoBJxQ|7m25TY03U&{B0>KZ*0oJ-_RZ6HtZZW_h%&td>yi^9d&;aFP zvHb@yHuxR!`CtkHMawIYCKBEjZJZv`=bWm@3yXr+0M0 zY007Z2F}?WoA10_DMIJ`gPkZ)O928u06zc%01g0YnI~8FLCl=71ONcI50e=MTLuON H00000LXc6v delta 1245 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 ZDF6Tf000000001!Qw=}{s0{!B008*kzpnrQ delta 3371 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 Bn=b$W diff --git a/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip b/tests/e2e/detectors/test_data/naming-convention/0.7.6/no_warning_for_public_constants.sol-0.7.6.zip index 7b304b5c0c51361e8d7eb38abb0c614fcc9b6015..9f2c1a1a7d5a108a3277c3cdde3a8e3958a51c5d 100644 GIT binary patch delta 1210 zcmV;r1V#JJ3fBr7P)h>@KL7#%4ghJHCs#WZb_|CE002S{001|W{RBFZRU>~*m|5C* zD92k>W(oLY$RrgQ3gjxjEce0ipYt5wxm?mMg1 z!?aES#YRK*y$&n>uC}UR(=!r7N~MGhMaQF&CtYP=swZ=xV(;-?C)ok`oa6^%<{q}9 zP1E2tL&?33pTFiG9aPi!NlJeN;~-U1_3Xxy;Q=5dfq7MNZmxntGvFysyGS4jq8GQbT$C;ac%IIn^W51f+T>z{X}0 zMbwD*2^_!yJ?!-W2&iy3y#Zox(S+HZ!fAM|BJdCoaom6xSFsWEw?BW$W+Z4$y4dDV zujTrnr}Rf7tWuhG9c$O{ccThSHO$`0Ke(L&dp7=<)MEFJBTPE4BLW!Tw4W; z!)qdAj-o|9rOVTcO3~(j`lx+q0PRdocTr#Hy@)QU+7$bA`o%Awa5(FnpNsrrFuhyt$CWCv zVv+M$dg{x)yBU8zG85pE@w48F-}y;?Yt_7M*LCv}T0YHqh%RHqOHp-CV7AVG642)X zqW!`dtQHIkx4o+Loj8=RzTal$o1*Uen{#i9YmE#eA7I=qOXpRkO|NwmM9xQ(^L5o{Ml?U)J4?+&K&42j z1!J)8I_=DF6S50Xlk6O928u06zc%01g0YnI~5} Y6m|y;hXeosLJyPd1X~8&1ONa40C4q9J^%m! delta 1195 zcmV;c1XTOi3e5@_P)h>@KL7#%4gfoicUC(~IvITg002D^kr-fqJ|EX}y%sU?M-PRi zm0nlZdjJq|?-l5q5W}VAK!X$~yhYNz{x3$S;g((ndY>|}t(Qr6=UkA>bk%pZW|Xyk zrQe*weOeB`)1lL#N+Lu>=!z=sQlS87o3+&huXYgLmwM+m3uP)To~Hn zL@5p8M8E0G-izgbkV^<^EJ&Bdy>q@3k5lY(P;?^K+u39yKr$~9q%p%E<7|9U9=e%1 znE=A7qeF=B!WF2b_=b%V6mKS701A(sQ|0>pC2ohLaAEO@SC%p3GA}1*?YF}wCV@>i zVx$qli}G^$P?gpI2BC ztFxNQgyU1chQb@n>%uM@I2veB^Qdl7bgpFO=57sw3Hg%DO;I!J25Aypkzd_5f9qTg zljpR6@j(amrZ1S^O4&Vk)FF|l?@D_xt>Bf*ctae^08V?8YRSo<)vK!X6MVZ4v+!hE ze|L7=ZR5ays2dYNOXbH7{5ui~ID-U|Fl+L68*f-s(}((dFK#DLlO`C}!AuP(haP5CRbj5S>X+9d+&VH`LpnKEsG7b7jQ5$^P%c<)gl52 zve}2r{en?{Vi5Wd_a9a2q+?&2E)a_gixd>OV?%R5938z!K0&agXiaUM*T^|GKp9h0 zq6fr(DL{O;>|$fDOj4JcV*(UH$2Z(p$~^-4)D?bY!IPruOR8{x>9d$YJnIFIYsd1M296&xdvxpTCmHnv z-%#A?dPY5=0nj}mcXv@}W z#yKuZrqNkkcK`4YWgOjj8!hpVNtt!Jhd8G(5(Y)zaJOZvhqhM-h5P3wwv|`uq-cD9 zaY)D83{b{@g+&hl#o7E)tyzkYA{*YBBa*olsTr|PFje)qwL#0da5gSZZ%8fXWm)FAe=yt;5 z`yF~RpTc#Qs@qD=!=xYaE3Pp!xf$tyiL^fF9Qaw166x4#tB=Nl#~KCejk)0 Date: Fri, 8 Sep 2023 05:16:54 +0200 Subject: [PATCH 18/29] Make the results deterministic (#2114) --- slither/detectors/statements/divide_before_multiply.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/slither/detectors/statements/divide_before_multiply.py b/slither/detectors/statements/divide_before_multiply.py index 6f199db414..334da592c0 100644 --- a/slither/detectors/statements/divide_before_multiply.py +++ b/slither/detectors/statements/divide_before_multiply.py @@ -2,7 +2,7 @@ Module detecting possible loss of precision due to divide before multiple """ from collections import defaultdict -from typing import DefaultDict, List, Set, Tuple +from typing import DefaultDict, List, Tuple from slither.core.cfg.node import Node from slither.core.declarations.contract import Contract @@ -63,7 +63,7 @@ def is_assert(node: Node) -> bool: # pylint: disable=too-many-branches def _explore( - to_explore: Set[Node], f_results: List[List[Node]], divisions: DefaultDict[LVALUE, List[Node]] + to_explore: List[Node], f_results: List[List[Node]], divisions: DefaultDict[LVALUE, List[Node]] ) -> None: explored = set() while to_explore: # pylint: disable=too-many-nested-blocks @@ -114,7 +114,7 @@ def _explore( f_results.append(node_results) for son in node.sons: - to_explore.add(son) + to_explore.append(son) def detect_divide_before_multiply( @@ -145,7 +145,7 @@ def detect_divide_before_multiply( # track all the division results (and the assignment of the division results) divisions: DefaultDict[LVALUE, List[Node]] = defaultdict(list) - _explore({function.entry_point}, f_results, divisions) + _explore([function.entry_point], f_results, divisions) for f_result in f_results: results.append((function, f_result)) From 9da51fff3b5b16c04f44370fddcfe1aba48edd37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20L=C3=B3pez?= <2642849+elopez@users.noreply.github.com> Date: Fri, 8 Sep 2023 00:32:32 -0300 Subject: [PATCH 19/29] detectors: cache_array_length: include source mapping in finding (#2076) * detectors: cache_array_length: include source mapping in finding The detector was manually string-interpolating the code and line information, which left the finding without source mapping metadata and broke filtering. Include the node directly on the finding info so that the metadata is preserved. --------- Co-authored-by: alpharush <0xalpharush@protonmail.com> --- .../operations/cache_array_length.py | 5 ++--- ...yLength_0_8_17_CacheArrayLength_sol__0.txt | 20 +++++++++---------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/slither/detectors/operations/cache_array_length.py b/slither/detectors/operations/cache_array_length.py index e4d8cf2c69..59289ed0f7 100644 --- a/slither/detectors/operations/cache_array_length.py +++ b/slither/detectors/operations/cache_array_length.py @@ -216,9 +216,8 @@ def _detect(self): for usage in non_optimal_array_len_usages: info = [ "Loop condition ", - f"`{usage.source_mapping.content}` ", - f"({usage.source_mapping}) ", - "should use cached array length instead of referencing `length` member " + usage, + " should use cached array length instead of referencing `length` member " "of the storage array.\n ", ] res = self.generate_result(info) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt index 456c702a58..c2a5023a6f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_CacheArrayLength_0_8_17_CacheArrayLength_sol__0.txt @@ -1,20 +1,20 @@ -Loop condition `j < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#109) should use cached array length instead of referencing `length` member of the storage array. +Loop condition k_scope_17 < array2.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#133) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#161) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_23 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#172) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#172) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#37) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `j < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#126) should use cached array length instead of referencing `length` member of the storage array. +Loop condition j_scope_11 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#109) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `k < array2.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#133) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_4 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#68) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#68) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_22 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#167) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `k < array2.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#99) should use cached array length instead of referencing `length` member of the storage array. +Loop condition k_scope_9 < array2.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#99) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#167) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_6 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#80) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#37) should use cached array length instead of referencing `length` member of the storage array. +Loop condition j_scope_15 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#126) should use cached array length instead of referencing `length` member of the storage array. -Loop condition `i < array.length` (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#80) should use cached array length instead of referencing `length` member of the storage array. +Loop condition i_scope_21 < array.length (tests/e2e/detectors/test_data/cache-array-length/0.8.17/CacheArrayLength.sol#161) should use cached array length instead of referencing `length` member of the storage array. From 53c97f9f481a2e9877b177b5186c8ffdb62e3305 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Thu, 7 Sep 2023 23:32:27 -0500 Subject: [PATCH 20/29] fix: preserve None tuple components in the left and right liftings of ternary expressions (#2120) * preserve None tuple components in the left and right liftings of ternary expressions * added a test for ternary lifting over tuples --------- Co-authored-by: Kevin Clancy --- slither/utils/expression_manipulations.py | 5 +- .../slithir/test_data/ternary_expressions.sol | 30 ++++---- .../unit/slithir/test_ternary_expressions.py | 77 ++++++++++++------- 3 files changed, 70 insertions(+), 42 deletions(-) diff --git a/slither/utils/expression_manipulations.py b/slither/utils/expression_manipulations.py index 75d97042c2..32b88e9b32 100644 --- a/slither/utils/expression_manipulations.py +++ b/slither/utils/expression_manipulations.py @@ -147,7 +147,7 @@ def convert_expressions( for next_expr in expression.expressions: # TODO: can we get rid of `NoneType` expressions in `TupleExpression`? # montyly: this might happen with unnamed tuple (ex: (,,,) = f()), but it needs to be checked - if next_expr: + if next_expr is not None: if self.conditional_not_ahead( next_expr, true_expression, false_expression, f_expressions @@ -158,6 +158,9 @@ def convert_expressions( true_expression.expressions[-1], false_expression.expressions[-1], ) + else: + true_expression.expressions.append(None) + false_expression.expressions.append(None) def convert_index_access( self, next_expr: IndexAccess, true_expression: Expression, false_expression: Expression diff --git a/tests/unit/slithir/test_data/ternary_expressions.sol b/tests/unit/slithir/test_data/ternary_expressions.sol index ebfb96e801..1ccd51d34d 100644 --- a/tests/unit/slithir/test_data/ternary_expressions.sol +++ b/tests/unit/slithir/test_data/ternary_expressions.sol @@ -1,6 +1,6 @@ interface Test { function test() external payable returns (uint); - function testTuple() external payable returns (uint, uint); + function testTuple(uint) external payable returns (uint, uint); } contract C { // TODO @@ -36,21 +36,23 @@ contract C { } // Unused tuple variable - function g(address one) public { - (, uint x) = Test(one).testTuple(); - } - uint[] myIntegers; - function _h(uint c) internal returns(uint) { - return c; - } - function h(bool cond, uint a, uint b) public { - uint d = _h( - myIntegers[cond ? a : b] - ); + function g(address one, bool cond, uint a, uint b) public { + (, uint x) = Test(one).testTuple(myIntegers[cond ? a : b]); } - - function i(bool cond) public { + + function h(bool cond) public { bytes memory a = new bytes(cond ? 1 : 2); } } + +contract D { + function values(uint n) internal returns (uint, uint) { + return (0, 1); + } + + function a(uint n) external { + uint a; + (a,) = values(n > 0 ? 1 : 0); + } +} diff --git a/tests/unit/slithir/test_ternary_expressions.py b/tests/unit/slithir/test_ternary_expressions.py index 712c9582b0..bf8556f85d 100644 --- a/tests/unit/slithir/test_ternary_expressions.py +++ b/tests/unit/slithir/test_ternary_expressions.py @@ -16,30 +16,53 @@ def test_ternary_conversions(solc_binary_path) -> None: """This tests that true and false sons define the same number of variables that the father node declares""" solc_path = solc_binary_path("0.8.0") slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) - for contract in slither.contracts: - if not contract.is_signature_only: - for function in contract.functions: - vars_declared = 0 - vars_assigned = 0 - for node in function.nodes: - if node.type in [NodeType.IF, NodeType.IFLOOP]: - - # Iterate over true and false son - for inner_node in node.sons: - # Count all variables declared - expression = inner_node.expression - if isinstance( - expression, (AssignmentOperation, NewElementaryType, CallExpression) - ): - var_expr = expression.expression_left - # Only tuples declare more than one var - if isinstance(var_expr, TupleExpression): - vars_declared += len(var_expr.expressions) - else: - vars_declared += 1 - - for ir in inner_node.irs: - # Count all variables defined - if isinstance(ir, (Assignment, Unpack)): - vars_assigned += 1 - assert vars_declared == vars_assigned and vars_assigned != 0 + contract = next(c for c in slither.contracts if c.name == "C") + for function in contract.functions: + vars_declared = 0 + vars_assigned = 0 + for node in function.nodes: + if node.type in [NodeType.IF, NodeType.IFLOOP]: + + # Iterate over true and false son + for inner_node in node.sons: + # Count all variables declared + expression = inner_node.expression + if isinstance( + expression, (AssignmentOperation, NewElementaryType, CallExpression) + ): + var_expr = expression.expression_left + # Only tuples declare more than one var + if isinstance(var_expr, TupleExpression): + vars_declared += len(var_expr.expressions) + else: + vars_declared += 1 + + for ir in inner_node.irs: + # Count all variables defined + if isinstance(ir, (Assignment, Unpack)): + vars_assigned += 1 + assert vars_declared == vars_assigned and vars_assigned != 0 + + +def test_ternary_tuple(solc_binary_path) -> None: + """ + Test that in the ternary liftings of an assignment of the form `(z, ) = ...`, + we obtain `z` from an unpack operation in both lifitings + """ + solc_path = solc_binary_path("0.8.0") + slither = Slither(Path(TEST_DATA_DIR, "ternary_expressions.sol").as_posix(), solc=solc_path) + contract = next(c for c in slither.contracts if c.name == "D") + fn = next(f for f in contract.functions if f.name == "a") + + if_nodes = [n for n in fn.nodes if n.type == NodeType.IF] + assert len(if_nodes) == 1 + + if_node = if_nodes[0] + assert isinstance(if_node.son_true.expression, AssignmentOperation) + assert ( + len([ir for ir in if_node.son_true.all_slithir_operations() if isinstance(ir, Unpack)]) == 1 + ) + assert ( + len([ir for ir in if_node.son_false.all_slithir_operations() if isinstance(ir, Unpack)]) + == 1 + ) From 8b07fe59d53498de89e5e79527c126bf0ac1f20a Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Fri, 8 Sep 2023 06:39:49 +0200 Subject: [PATCH 21/29] improve name resolution of type aliases (#2061) * BREAKING CHANGE: Renamed user_defined_types to type_aliases so it's less confusing with what we call UserDefinedType. * Added type aliased at the Contract level so now at the file scope there are only top level aliasing and fully qualified contract aliasing like C.myAlias. * Fix #1809 --- slither/core/compilation_unit.py | 6 ++-- slither/core/declarations/contract.py | 34 ++++++++++++++++++ slither/core/scope/scope.py | 6 ++-- slither/solc_parsing/declarations/contract.py | 8 ++--- .../declarations/using_for_top_level.py | 2 +- .../solc_parsing/expressions/find_variable.py | 9 +++-- .../slither_compilation_unit_solc.py | 8 ++--- .../solidity_types/type_parsing.py | 30 ++++++++-------- .../visitors/slithir/expression_to_slithir.py | 4 +-- tests/e2e/solc_parsing/test_ast_parsing.py | 1 + .../type-aliases.sol-0.8.19-compact.zip | Bin 0 -> 2111 bytes .../type-aliases.sol-0.8.19-compact.json | 6 ++++ .../solc_parsing/test_data/type-aliases.sol | 20 +++++++++++ tests/unit/core/test_source_mapping.py | 6 ++-- 14 files changed, 101 insertions(+), 39 deletions(-) create mode 100644 tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip create mode 100644 tests/e2e/solc_parsing/test_data/expected/type-aliases.sol-0.8.19-compact.json create mode 100644 tests/e2e/solc_parsing/test_data/type-aliases.sol diff --git a/slither/core/compilation_unit.py b/slither/core/compilation_unit.py index 6d24786eb1..35180cefc0 100644 --- a/slither/core/compilation_unit.py +++ b/slither/core/compilation_unit.py @@ -47,7 +47,7 @@ def __init__(self, core: "SlitherCore", crytic_compilation_unit: CompilationUnit self._pragma_directives: List[Pragma] = [] self._import_directives: List[Import] = [] self._custom_errors: List[CustomErrorTopLevel] = [] - self._user_defined_value_types: Dict[str, TypeAliasTopLevel] = {} + self._type_aliases: Dict[str, TypeAliasTopLevel] = {} self._all_functions: Set[Function] = set() self._all_modifiers: Set[Modifier] = set() @@ -220,8 +220,8 @@ def custom_errors(self) -> List[CustomErrorTopLevel]: return self._custom_errors @property - def user_defined_value_types(self) -> Dict[str, TypeAliasTopLevel]: - return self._user_defined_value_types + def type_aliases(self) -> Dict[str, TypeAliasTopLevel]: + return self._type_aliases # endregion ################################################################################### diff --git a/slither/core/declarations/contract.py b/slither/core/declarations/contract.py index 9b1488db31..f9bf153064 100644 --- a/slither/core/declarations/contract.py +++ b/slither/core/declarations/contract.py @@ -45,6 +45,7 @@ from slither.core.compilation_unit import SlitherCompilationUnit from slither.core.scope.scope import FileScope from slither.core.cfg.node import Node + from slither.core.solidity_types import TypeAliasContract LOGGER = logging.getLogger("Contract") @@ -81,6 +82,7 @@ def __init__(self, compilation_unit: "SlitherCompilationUnit", scope: "FileScope self._functions: Dict[str, "FunctionContract"] = {} self._linearizedBaseContracts: List[int] = [] self._custom_errors: Dict[str, "CustomErrorContract"] = {} + self._type_aliases: Dict[str, "TypeAliasContract"] = {} # The only str is "*" self._using_for: Dict[USING_FOR_KEY, USING_FOR_ITEM] = {} @@ -364,6 +366,38 @@ def custom_errors_declared(self) -> List["CustomErrorContract"]: def custom_errors_as_dict(self) -> Dict[str, "CustomErrorContract"]: return self._custom_errors + # endregion + ################################################################################### + ################################################################################### + # region Custom Errors + ################################################################################### + ################################################################################### + + @property + def type_aliases(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the contract's custom errors + """ + return list(self._type_aliases.values()) + + @property + def type_aliases_inherited(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the inherited custom errors + """ + return [s for s in self.type_aliases if s.contract != self] + + @property + def type_aliases_declared(self) -> List["TypeAliasContract"]: + """ + list(TypeAliasContract): List of the custom errors declared within the contract (not inherited) + """ + return [s for s in self.type_aliases if s.contract == self] + + @property + def type_aliases_as_dict(self) -> Dict[str, "TypeAliasContract"]: + return self._type_aliases + # endregion ################################################################################### ################################################################################### diff --git a/slither/core/scope/scope.py b/slither/core/scope/scope.py index cafeb3585d..937a051361 100644 --- a/slither/core/scope/scope.py +++ b/slither/core/scope/scope.py @@ -52,7 +52,7 @@ def __init__(self, filename: Filename) -> None: # User defined types # Name -> type alias - self.user_defined_types: Dict[str, TypeAlias] = {} + self.type_aliases: Dict[str, TypeAlias] = {} def add_accesible_scopes(self) -> bool: """ @@ -95,8 +95,8 @@ def add_accesible_scopes(self) -> bool: if not _dict_contain(new_scope.renaming, self.renaming): self.renaming.update(new_scope.renaming) learn_something = True - if not _dict_contain(new_scope.user_defined_types, self.user_defined_types): - self.user_defined_types.update(new_scope.user_defined_types) + if not _dict_contain(new_scope.type_aliases, self.type_aliases): + self.type_aliases.update(new_scope.type_aliases) learn_something = True return learn_something diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index 74a1cbcf0d..a118b1e650 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -291,10 +291,10 @@ def _parse_type_alias(self, item: Dict) -> None: alias = item["name"] alias_canonical = self._contract.name + "." + item["name"] - user_defined_type = TypeAliasContract(original_type, alias, self.underlying_contract) - user_defined_type.set_offset(item["src"], self.compilation_unit) - self._contract.file_scope.user_defined_types[alias] = user_defined_type - self._contract.file_scope.user_defined_types[alias_canonical] = user_defined_type + type_alias = TypeAliasContract(original_type, alias, self.underlying_contract) + type_alias.set_offset(item["src"], self.compilation_unit) + self._contract.type_aliases_as_dict[alias] = type_alias + self._contract.file_scope.type_aliases[alias_canonical] = type_alias def _parse_struct(self, struct: Dict) -> None: diff --git a/slither/solc_parsing/declarations/using_for_top_level.py b/slither/solc_parsing/declarations/using_for_top_level.py index fe72e57809..bfed3c417c 100644 --- a/slither/solc_parsing/declarations/using_for_top_level.py +++ b/slither/solc_parsing/declarations/using_for_top_level.py @@ -152,7 +152,7 @@ def _propagate_global(self, type_name: Union[TypeAliasTopLevel, UserDefinedType] if self._global: for scope in self.compilation_unit.scopes.values(): if isinstance(type_name, TypeAliasTopLevel): - for alias in scope.user_defined_types.values(): + for alias in scope.type_aliases.values(): if alias == type_name: scope.using_for_directives.add(self._using_for) elif isinstance(type_name, UserDefinedType): diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 32f5afc584..3bbdd268ef 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -114,6 +114,8 @@ def find_top_level( :return: :rtype: """ + if var_name in scope.type_aliases: + return scope.type_aliases[var_name], False if var_name in scope.structures: return scope.structures[var_name], False @@ -205,6 +207,10 @@ def _find_in_contract( if sig == var_name: return modifier + type_aliases = contract.type_aliases_as_dict + if var_name in type_aliases: + return type_aliases[var_name] + # structures are looked on the contract declarer structures = contract.structures_as_dict if var_name in structures: @@ -362,9 +368,6 @@ def find_variable( if var_name in current_scope.renaming: var_name = current_scope.renaming[var_name] - if var_name in current_scope.user_defined_types: - return current_scope.user_defined_types[var_name], False - # Use ret0/ret1 to help mypy ret0 = _find_variable_from_ref_declaration( referenced_declaration, direct_contracts, direct_functions diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index 00ac3a5192..ecfecb4f03 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -344,10 +344,10 @@ def parse_top_level_from_loaded_json(self, data_loaded: Dict, filename: str) -> original_type = ElementaryType(underlying_type["name"]) - user_defined_type = TypeAliasTopLevel(original_type, alias, scope) - user_defined_type.set_offset(top_level_data["src"], self._compilation_unit) - self._compilation_unit.user_defined_value_types[alias] = user_defined_type - scope.user_defined_types[alias] = user_defined_type + type_alias = TypeAliasTopLevel(original_type, alias, scope) + type_alias.set_offset(top_level_data["src"], self._compilation_unit) + self._compilation_unit.type_aliases[alias] = type_alias + scope.type_aliases[alias] = type_alias else: raise SlitherException(f"Top level {top_level_data[self.get_key()]} not supported") diff --git a/slither/solc_parsing/solidity_types/type_parsing.py b/slither/solc_parsing/solidity_types/type_parsing.py index e12290722f..c03b8e6562 100644 --- a/slither/solc_parsing/solidity_types/type_parsing.py +++ b/slither/solc_parsing/solidity_types/type_parsing.py @@ -235,7 +235,7 @@ def parse_type( sl: "SlitherCompilationUnit" renaming: Dict[str, str] - user_defined_types: Dict[str, TypeAlias] + type_aliases: Dict[str, TypeAlias] enums_direct_access: List["Enum"] = [] # Note: for convenicence top level functions use the same parser than function in contract # but contract_parser is set to None @@ -247,13 +247,13 @@ def parse_type( sl = caller_context.compilation_unit next_context = caller_context renaming = {} - user_defined_types = sl.user_defined_value_types + type_aliases = sl.type_aliases else: assert isinstance(caller_context, FunctionSolc) sl = caller_context.underlying_function.compilation_unit next_context = caller_context.slither_parser renaming = caller_context.underlying_function.file_scope.renaming - user_defined_types = caller_context.underlying_function.file_scope.user_defined_types + type_aliases = caller_context.underlying_function.file_scope.type_aliases structures_direct_access = sl.structures_top_level all_structuress = [c.structures for c in sl.contracts] all_structures = [item for sublist in all_structuress for item in sublist] @@ -299,7 +299,7 @@ def parse_type( functions = list(scope.functions) renaming = scope.renaming - user_defined_types = scope.user_defined_types + type_aliases = scope.type_aliases elif isinstance(caller_context, (ContractSolc, FunctionSolc)): sl = caller_context.compilation_unit if isinstance(caller_context, FunctionSolc): @@ -329,7 +329,7 @@ def parse_type( functions = contract.functions + contract.modifiers renaming = scope.renaming - user_defined_types = scope.user_defined_types + type_aliases = scope.type_aliases else: raise ParsingError(f"Incorrect caller context: {type(caller_context)}") @@ -343,8 +343,8 @@ def parse_type( name = t.name if name in renaming: name = renaming[name] - if name in user_defined_types: - return user_defined_types[name] + if name in type_aliases: + return type_aliases[name] return _find_from_type_name( name, functions, @@ -365,9 +365,9 @@ def parse_type( name = t["typeDescriptions"]["typeString"] if name in renaming: name = renaming[name] - if name in user_defined_types: - _add_type_references(user_defined_types[name], t["src"], sl) - return user_defined_types[name] + if name in type_aliases: + _add_type_references(type_aliases[name], t["src"], sl) + return type_aliases[name] type_found = _find_from_type_name( name, functions, @@ -386,9 +386,9 @@ def parse_type( name = t["attributes"][type_name_key] if name in renaming: name = renaming[name] - if name in user_defined_types: - _add_type_references(user_defined_types[name], t["src"], sl) - return user_defined_types[name] + if name in type_aliases: + _add_type_references(type_aliases[name], t["src"], sl) + return type_aliases[name] type_found = _find_from_type_name( name, functions, @@ -407,8 +407,8 @@ def parse_type( name = t["name"] if name in renaming: name = renaming[name] - if name in user_defined_types: - return user_defined_types[name] + if name in type_aliases: + return type_aliases[name] type_found = _find_from_type_name( name, functions, diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 005ad81a44..a1dadbb63f 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -516,8 +516,8 @@ def _post_member_access(self, expression: MemberAccess) -> None: # contract A { type MyInt is int} # contract B { function f() public{ A.MyInt test = A.MyInt.wrap(1);}} # The logic is handled by _post_call_expression - if expression.member_name in expr.file_scope.user_defined_types: - set_val(expression, expr.file_scope.user_defined_types[expression.member_name]) + if expression.member_name in expr.file_scope.type_aliases: + set_val(expression, expr.file_scope.type_aliases[expression.member_name]) return # Lookup errors referred to as member of contract e.g. Test.myError.selector if expression.member_name in expr.custom_errors_as_dict: diff --git a/tests/e2e/solc_parsing/test_ast_parsing.py b/tests/e2e/solc_parsing/test_ast_parsing.py index 307e6736ff..28ac79986d 100644 --- a/tests/e2e/solc_parsing/test_ast_parsing.py +++ b/tests/e2e/solc_parsing/test_ast_parsing.py @@ -459,6 +459,7 @@ def make_version(minor: int, patch_min: int, patch_max: int) -> List[str]: ["0.6.9", "0.7.6", "0.8.16"], ), Test("user_defined_operators-0.8.19.sol", ["0.8.19"]), + Test("type-aliases.sol", ["0.8.19"]), ] # create the output folder if needed try: diff --git a/tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip b/tests/e2e/solc_parsing/test_data/compile/type-aliases.sol-0.8.19-compact.zip new file mode 100644 index 0000000000000000000000000000000000000000..0c4d2b1c5e2a155c49cf64c3815266e1b19dc65c GIT binary patch literal 2111 zcma);c{~%01I9OJxsQm+D3WuIO=yngT$3ZTFiXQoIT}L9BFBu}xd~_y6zn`904c-+!L}zmKIUGm9R83BUvJOW8wPCc@A!*#UsH%K(5h z008iN@(8bl^Ki%c;(Z~$-X4zlz(?LbevUXF=lkydc*p}^Z?Cf~tN<(k@C*RZA(7mm zzo3MIk-<7RcTSg=`{h<}<8_p<#y;otLnW1npKSTWw~f zBa8XyV}68OuQM$JorFk_!s@gN;3P;l+y(BnDnyfl4kkAS`vo*Ma{A=wTpBg0$Ay>o z3-uHV%T+$-vSxLP?B0_|c3p6-ITv0jnLO9<&3+woic|Ep-Xn)} zM@b=K%e93)mX0S(p}N0n^gG*J4w(KXju6RV4#S6+?gsVPPkrA#D@_?6qn7H&9=ZJ! z=~uLW^wC>^Xwurpy*dq!5f%AaMR;Nw}WPdo=paOK7wNJQj8sd)A z(c%O>+;+^{~yroyf>)K}#v%W(-L+m5kT?$l}GW5*ylr3eb|t#Fm}7ZroySAPZ6To~5Rh z9H?q>UVPF~au$?j!J6nF+|9SC8kxc5ywCA_47jFn2x;^J+)D)JA7*# zyv}r%eesE!N0uq6-{M4ElI|)bj}~aPCal-QXVZ<($k=*6*5Hxbs8yK`hJ)r37N1#s zS*q0^2<+uzzTpI=*Hga*HS=+Ol2CLv{{k_ZX&*H7hL735m;T^pXTdrkU0voWhMBW! zz!wg_$yRFI^XJZh@}BE^Lp)8O3YHbCaE6i`qHk7?=#9o*vwEQVz~#o!cndx=B~=}) zT!%~=x*|G&i~#ZCOtA)Z+xSvd$Q)rD<+0v;3>UD{SH_BTTM~ZM^dz!MYO-{c)*MRT|}$l zZ0{y$#>g^Q_Rz6W*6Xg|?~IR7Wl5}00 zlO3D6$-)NmXPH|7Blvz1u+KQ%NU-90C)pJ5`#lgVQX5oehE;Q|Q!n>pA07QBjH}Wn z4+?m1=N;3G5Hxx3PyeVbqz77NrAEM>Yb+Dk7JyaPj&>&jFd1JG`#xf5WJ*R3c^=yA z^c1C(d`+h~+JX{DtV$uK4^zcL_dSQ$^-rCXQj5BHzl8Q+MHw&$4@z`99Hq~5Ujbv9 z?D+xX7DgwAG8T7NUvRe1(%d)=aBDIc(Nl+;7{t&u=0(JMRhY6^64O>L`{j4I(4XK%6J!mO%ueAL?(?-2om<8Od!|^T6Os znLvRB>A3lU9z6TPKPhi#D=2Dx@>0d%IQ-(*w40I!C9WukjBHu!RP2^;Z{{5YGvW52 z4D0XthxB2a`(=m2z*lU)ekQyPY;n61riRLo%`nEjEQx@9h8Kzoy7<(+|J^cY5^LQw zrEF6NcYn(1^6q^G2O|)e3E>h8D(nmS(p*-#OR;^RLc2hB-AJ2$l38L*IMEfzM7&6H zuuU%Q2*2w82(4h?qV)~2H2pibUnn7OwxR<901V9}euaH#5bA|vT5@Ei^1wS$%B^}* z6b_iiqIm8exPe8aXQzz0W`!Uq73BBJEH1yVd$z8fFX~+tvI!>5sN9(Ww?|>bF9ZDrut|7S&tv#F`21SA{*q2}QkJ8PU1Iw0d=Ne$?udB}g9Y;4K{( z(9V~nr9s1$4|NxO(mjnSr8MAm{uYV1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n}\n" + }, + "DeleteTest": {} +} \ No newline at end of file diff --git a/tests/e2e/solc_parsing/test_data/type-aliases.sol b/tests/e2e/solc_parsing/test_data/type-aliases.sol new file mode 100644 index 0000000000..53fdaabeb8 --- /dev/null +++ b/tests/e2e/solc_parsing/test_data/type-aliases.sol @@ -0,0 +1,20 @@ + +struct Z { + int x; + int y; +} + +contract OtherTest { + struct Z { + int x; + int y; + } + + function myfunc() external { + Z memory z = Z(2,3); + } +} + +contract DeleteTest { + type Z is int; +} diff --git a/tests/unit/core/test_source_mapping.py b/tests/unit/core/test_source_mapping.py index fe53359777..55eb082950 100644 --- a/tests/unit/core/test_source_mapping.py +++ b/tests/unit/core/test_source_mapping.py @@ -85,15 +85,13 @@ def test_references_user_defined_aliases(solc_binary_path): file = Path(SRC_MAPPING_TEST_ROOT, "ReferencesUserDefinedAliases.sol").as_posix() slither = Slither(file, solc=solc_path) - alias_top_level = slither.compilation_units[0].user_defined_value_types["aliasTopLevel"] + alias_top_level = slither.compilation_units[0].type_aliases["aliasTopLevel"] assert len(alias_top_level.references) == 2 lines = _sort_references_lines(alias_top_level.references) assert lines == [12, 16] alias_contract_level = ( - slither.compilation_units[0] - .contracts[0] - .file_scope.user_defined_types["C.aliasContractLevel"] + slither.compilation_units[0].contracts[0].file_scope.type_aliases["C.aliasContractLevel"] ) assert len(alias_contract_level.references) == 2 lines = _sort_references_lines(alias_contract_level.references) From 8d5c033fbeaea0c464bb0cfb177ab9e1124ddf3a Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Fri, 8 Sep 2023 15:19:20 +0200 Subject: [PATCH 22/29] Improve mapping-deletion detector for nested mappings (#2084) * Fix for nested mappings * Add test --- .../detectors/statements/mapping_deletion.py | 24 +++++++++++++----- ...etection_0_4_25_MappingDeletion_sol__0.txt | 7 +++-- ...etection_0_5_16_MappingDeletion_sol__0.txt | 7 +++-- ...etection_0_6_11_MappingDeletion_sol__0.txt | 7 +++-- ...Detection_0_7_6_MappingDeletion_sol__0.txt | 7 +++-- .../0.4.25/MappingDeletion.sol | 19 +++++++++++--- .../0.4.25/MappingDeletion.sol-0.4.25.zip | Bin 4451 -> 4826 bytes .../0.5.16/MappingDeletion.sol | 12 ++++++++- .../0.5.16/MappingDeletion.sol-0.5.16.zip | Bin 4490 -> 4854 bytes .../0.6.11/MappingDeletion.sol | 12 ++++++++- .../0.6.11/MappingDeletion.sol-0.6.11.zip | Bin 4462 -> 4829 bytes .../0.7.6/MappingDeletion.sol | 12 ++++++++- .../0.7.6/MappingDeletion.sol-0.7.6.zip | Bin 4359 -> 4728 bytes 13 files changed, 86 insertions(+), 21 deletions(-) diff --git a/slither/detectors/statements/mapping_deletion.py b/slither/detectors/statements/mapping_deletion.py index 4cdac72400..0940d5a07b 100644 --- a/slither/detectors/statements/mapping_deletion.py +++ b/slither/detectors/statements/mapping_deletion.py @@ -6,6 +6,7 @@ from slither.core.cfg.node import Node from slither.core.declarations import Structure from slither.core.declarations.contract import Contract +from slither.core.variables.variable import Variable from slither.core.declarations.function_contract import FunctionContract from slither.core.solidity_types import MappingType, UserDefinedType from slither.detectors.abstract_detector import ( @@ -69,14 +70,25 @@ def detect_mapping_deletion( for ir in node.irs: if isinstance(ir, Delete): value = ir.variable - if isinstance(value.type, UserDefinedType) and isinstance( - value.type.type, Structure - ): - st = value.type.type - if any(isinstance(e.type, MappingType) for e in st.elems.values()): - ret.append((f, st, node)) + MappingDeletionDetection.check_if_mapping(value, ret, f, node) + return ret + @staticmethod + def check_if_mapping( + value: Variable, + ret: List[Tuple[FunctionContract, Structure, Node]], + f: FunctionContract, + node: Node, + ): + if isinstance(value.type, UserDefinedType) and isinstance(value.type.type, Structure): + st = value.type.type + if any(isinstance(e.type, MappingType) for e in st.elems.values()): + ret.append((f, st, node)) + return + for e in st.elems.values(): + MappingDeletionDetection.check_if_mapping(e, ret, f, node) + def _detect(self) -> List[Output]: """Detect mapping deletion diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt index 902f966688..4d47bb5709 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_4_25_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#41) + Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#28-31) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#30) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol#37) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt index fec236e1c2..88e4ac554f 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_5_16_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#10) -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#31) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#37) + +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol#41) diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt index 7f0372c36d..4270f0d86c 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_6_11_MappingDeletion_sol__0.txt @@ -1,6 +1,9 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#41) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#10) +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol#37) + diff --git a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt index f519a046f1..ea6ed2dd6a 100644 --- a/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt +++ b/tests/e2e/detectors/snapshots/detectors__detector_MappingDeletionDetection_0_7_6_MappingDeletion_sol__0.txt @@ -1,5 +1,8 @@ -Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#29-32) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: - -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#31) +Balances.deleteNestedBalance() (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#40-42) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete nestedStackBalance (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#41) + +Balances.deleteBalance(uint256) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#35-38) deletes Balances.BalancesStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#17-20) which contains a mapping: + -delete stackBalance[idx] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#37) Lib.deleteSt(Lib.MyStruct[1]) (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#9-11) deletes Lib.MyStruct (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#5-7) which contains a mapping: -delete st[0] (tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol#10) diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol index bedbb64a8f..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol @@ -6,7 +6,7 @@ library Lib{ mapping(address => uint) maps; } - function deleteSt(MyStruct[1] storage st){ + function deleteSt(MyStruct[1] storage st) internal { delete st[0]; } @@ -17,18 +17,29 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { - require(stackBalance[idx].owner == 0); - stackBalance[idx] = BalancesStruct(msg.sender); + require(stackBalance[idx].owner == address(0)); + BalancesStruct storage str = stackBalance[idx]; + str.owner = msg.sender; } function deleteBalance(uint idx) public { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.4.25/MappingDeletion.sol-0.4.25.zip index be3e13807a58aa1af11fdb342f340adc88a9755d..58859369959bfac936960954f215b5833a09526f 100644 GIT binary patch delta 4714 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 diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.5.16/MappingDeletion.sol-0.5.16.zip index 0ad84a58895f5b258c6da9782c5af54a4c8a90c0..2e578904619f0599c1f10815a5902848ac7061d6 100644 GIT binary patch delta 4742 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 l00XK304D$d00000000000Du7i0001!xe_-99}xfm005XpUMm0q diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol index e1b608a463..bcbc86c9d1 100644 --- a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol +++ b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol @@ -17,9 +17,15 @@ contract Balances { struct BalancesStruct{ address owner; mapping(address => uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.6.11/MappingDeletion.sol-0.6.11.zip index 5f66da061726c113304482f713b820a2633b3af7..8f532ea669ffceb1de40fa487ffbac2520a01042 100644 GIT binary patch delta 4724 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 uint) balances; - } + } + + struct NestedBalanceStruct { + BalancesStruct balanceStruct; + } mapping(uint => BalancesStruct) public stackBalance; + NestedBalanceStruct internal nestedStackBalance; + function createBalance(uint idx) public { require(stackBalance[idx].owner == address(0)); BalancesStruct storage str = stackBalance[idx]; @@ -30,6 +36,10 @@ contract Balances { require(stackBalance[idx].owner == msg.sender); delete stackBalance[idx]; } + + function deleteNestedBalance() public { + delete nestedStackBalance; + } function setBalance(uint idx, address addr, uint val) public { require(stackBalance[idx].owner == msg.sender); diff --git a/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip b/tests/e2e/detectors/test_data/mapping-deletion/0.7.6/MappingDeletion.sol-0.7.6.zip index 5888e0e534de961f401d61096c979e183b926d78..c685454ce649c797088054d6913880ef784de64a 100644 GIT binary patch delta 4615 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 delta 4267 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 Date: Mon, 11 Sep 2023 14:00:40 -0400 Subject: [PATCH 23/29] Change return type to UnaryType instead of UnaryOperationType (#2124) * fix: return UnaryType instead of UnaryOperationType for Unary IR operation (issue #2085) --- slither/slithir/operations/unary.py | 5 ++--- slither/visitors/slithir/expression_to_slithir.py | 10 +++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/slither/slithir/operations/unary.py b/slither/slithir/operations/unary.py index c6493921dc..72e7ac63ae 100644 --- a/slither/slithir/operations/unary.py +++ b/slither/slithir/operations/unary.py @@ -5,7 +5,6 @@ from slither.slithir.operations.lvalue import OperationWithLValue from slither.slithir.utils.utils import is_valid_lvalue, is_valid_rvalue from slither.slithir.exceptions import SlithIRError -from slither.core.expressions.unary_operation import UnaryOperationType from slither.core.variables.local_variable import LocalVariable from slither.slithir.variables.constant import Constant from slither.slithir.variables.local_variable import LocalIRVariable @@ -35,7 +34,7 @@ def __init__( self, result: Union[TemporaryVariableSSA, TemporaryVariable], variable: Union[Constant, LocalIRVariable, LocalVariable], - operation_type: UnaryOperationType, + operation_type: UnaryType, ) -> None: assert is_valid_rvalue(variable) assert is_valid_lvalue(result) @@ -53,7 +52,7 @@ def rvalue(self) -> Union[Constant, LocalVariable]: return self._variable @property - def type(self) -> UnaryOperationType: + def type(self) -> UnaryType: return self._type @property diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index a1dadbb63f..9aca7f10cc 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -50,6 +50,7 @@ Member, TypeConversion, Unary, + UnaryType, Unpack, Return, SolidityCall, @@ -109,6 +110,13 @@ def set_val(expression: Expression, val: Any) -> None: BinaryOperationType.OROR: BinaryType.OROR, } + +_unary_to_unary = { + UnaryOperationType.BANG: UnaryType.BANG, + UnaryOperationType.TILD: UnaryType.TILD, +} + + _signed_to_unsigned = { BinaryOperationType.DIVISION_SIGNED: BinaryType.DIVISION, BinaryOperationType.MODULO_SIGNED: BinaryType.MODULO, @@ -585,7 +593,7 @@ def _post_unary_operation(self, expression: UnaryOperation) -> None: operation: Operation if expression.type in [UnaryOperationType.BANG, UnaryOperationType.TILD]: lvalue = TemporaryVariable(self._node) - operation = Unary(lvalue, value, expression.type) + operation = Unary(lvalue, value, _unary_to_unary[expression.type]) operation.set_expression(expression) self._result.append(operation) set_val(expression, lvalue) From 324cbe5a5c268dbe3a3e0408b92a5b223aef23b4 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:45:01 -0500 Subject: [PATCH 24/29] Bump actions/checkout from 3 to 4 (#2112) Bumps [actions/checkout](https://github.com/actions/checkout) from 3 to 4. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/black.yml | 2 +- .github/workflows/ci.yml | 2 +- .github/workflows/docker.yml | 2 +- .github/workflows/docs.yml | 2 +- .github/workflows/doctor.yml | 2 +- .github/workflows/linter.yml | 2 +- .github/workflows/pip-audit.yml | 2 +- .github/workflows/publish.yml | 2 +- .github/workflows/pylint.yml | 2 +- .github/workflows/test.yml | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/.github/workflows/black.yml b/.github/workflows/black.yml index 33a1666b26..6017255b26 100644 --- a/.github/workflows/black.yml +++ b/.github/workflows/black.yml @@ -26,7 +26,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b59aacd66e..c1a54d4d21 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -53,7 +53,7 @@ jobs: - os: windows-2022 type: truffle steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 with: diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index 4cb1adcb1c..05406d0edc 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -17,7 +17,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Set up QEMU uses: docker/setup-qemu-action@v2 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 625cafe4f0..29356c0c6b 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -28,7 +28,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Setup Pages uses: actions/configure-pages@v3 - uses: actions/setup-python@v4 diff --git a/.github/workflows/doctor.yml b/.github/workflows/doctor.yml index 85d79f214f..0a0eb896de 100644 --- a/.github/workflows/doctor.yml +++ b/.github/workflows/doctor.yml @@ -29,7 +29,7 @@ jobs: - os: windows-2022 python: 3.8 steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml index 0468b07f8a..5415b6d1be 100644 --- a/.github/workflows/linter.yml +++ b/.github/workflows/linter.yml @@ -25,7 +25,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/pip-audit.yml b/.github/workflows/pip-audit.yml index 4fbc1a3fdc..a98f6ab58b 100644 --- a/.github/workflows/pip-audit.yml +++ b/.github/workflows/pip-audit.yml @@ -18,7 +18,7 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v4 - name: Install Python uses: actions/setup-python@v4 diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index b90d490df9..fef0a4a2eb 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 8c7e7bce93..7e990371ff 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -23,7 +23,7 @@ jobs: steps: - name: Checkout Code - uses: actions/checkout@v3 + uses: actions/checkout@v4 with: # Full git history is needed to get a proper list of changed files within `super-linter` fetch-depth: 0 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index b3754bfd78..6b911eb92f 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -27,7 +27,7 @@ jobs: type: ["unit", "integration", "tool"] python: ${{ (github.event_name == 'pull_request' && fromJSON('["3.8", "3.11"]')) || fromJSON('["3.8", "3.9", "3.10", "3.11"]') }} steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python }} uses: actions/setup-python@v4 with: @@ -84,7 +84,7 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 - name: Set up Python 3.8 uses: actions/setup-python@v4 with: From 7d50891e9e80964333651b9e0927626828d12a40 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Sep 2023 13:45:18 -0500 Subject: [PATCH 25/29] Bump cachix/install-nix-action from 22 to 23 (#2111) Bumps [cachix/install-nix-action](https://github.com/cachix/install-nix-action) from 22 to 23. Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c1a54d4d21..f04436bd38 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -67,7 +67,7 @@ jobs: - name: Set up nix if: matrix.type == 'dapp' - uses: cachix/install-nix-action@v22 + uses: cachix/install-nix-action@v23 - name: Set up cachix if: matrix.type == 'dapp' From 3147396cbf1dcf7d783b40c381878ba66e4138e3 Mon Sep 17 00:00:00 2001 From: alpharush <0xalpharush@protonmail.com> Date: Mon, 11 Sep 2023 16:56:45 -0500 Subject: [PATCH 26/29] fix(convert): do not convert array type to elementary for `InitArray` (#2018) fix(convert): do not convert array type to elementary for `InitArray` --- slither/slithir/convert.py | 2 +- slither/slithir/operations/init_array.py | 2 +- slither/slithir/operations/new_array.py | 2 +- tests/unit/slithir/test_ssa_generation.py | 22 +++++++++++++++++++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index d40715c4f3..75900f176f 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -1857,7 +1857,7 @@ def convert_constant_types(irs: List[Operation]) -> None: if isinstance(ir.lvalue.type.type, ElementaryType): if ir.lvalue.type.type.type in ElementaryTypeInt: for r in ir.read: - if r.type.type not in ElementaryTypeInt: + if r.type.type.type not in ElementaryTypeInt: r.set_type(ElementaryType(ir.lvalue.type.type.type)) was_changed = True diff --git a/slither/slithir/operations/init_array.py b/slither/slithir/operations/init_array.py index e0754c7705..ec2a63ef00 100644 --- a/slither/slithir/operations/init_array.py +++ b/slither/slithir/operations/init_array.py @@ -44,4 +44,4 @@ def convert(elem): return f"{elem}({elem.type})" init_values = convert(self.init_values) - return f"{self.lvalue}({self.lvalue.type}) = {init_values}" + return f"{self.lvalue}({self.lvalue.type}) = {init_values}" diff --git a/slither/slithir/operations/new_array.py b/slither/slithir/operations/new_array.py index 39b989459f..917bb11ee9 100644 --- a/slither/slithir/operations/new_array.py +++ b/slither/slithir/operations/new_array.py @@ -33,4 +33,4 @@ def read(self) -> List["Constant"]: def __str__(self): args = [str(a) for a in self.arguments] lvalue = self.lvalue - return f"{lvalue}{lvalue.type}) = new {self.array_type}({','.join(args)})" + return f"{lvalue}({lvalue.type}) = new {self.array_type}({','.join(args)})" diff --git a/tests/unit/slithir/test_ssa_generation.py b/tests/unit/slithir/test_ssa_generation.py index 3c7e84973f..b8772ca612 100644 --- a/tests/unit/slithir/test_ssa_generation.py +++ b/tests/unit/slithir/test_ssa_generation.py @@ -11,7 +11,7 @@ from slither import Slither from slither.core.cfg.node import Node, NodeType from slither.core.declarations import Function, Contract -from slither.core.solidity_types import ArrayType +from slither.core.solidity_types import ArrayType, ElementaryType from slither.core.variables.local_variable import LocalVariable from slither.core.variables.state_variable import StateVariable from slither.slithir.operations import ( @@ -1116,3 +1116,23 @@ def test_issue_1846_ternary_in_ternary(slither_from_source): assert node.type == NodeType.IF assert node.son_true.type == NodeType.IF assert node.son_false.type == NodeType.EXPRESSION + + +def test_issue_2016(slither_from_source): + source = """ + contract Contract { + function test() external { + int[] memory a = new int[](5); + } + } + """ + with slither_from_source(source) as slither: + c = slither.get_contract_from_name("Contract")[0] + f = c.functions[0] + operations = f.slithir_operations + new_op = operations[0] + lvalue = new_op.lvalue + lvalue_type = lvalue.type + assert isinstance(lvalue_type, ArrayType) + assert lvalue_type.type == ElementaryType("int256") + assert lvalue_type.is_dynamic From f50a126f2c8b94729d4e3ed2164199811347bce1 Mon Sep 17 00:00:00 2001 From: Simone <79767264+smonicas@users.noreply.github.com> Date: Mon, 11 Sep 2023 23:57:48 +0200 Subject: [PATCH 27/29] Improve custom error parsing with constants (#2115) * Improve custom error parsing with constants --- slither/solc_parsing/declarations/contract.py | 2 +- .../solc_parsing/declarations/custom_error.py | 9 ++++- .../solc_parsing/expressions/find_variable.py | 32 ++++++++++++++++++ .../slither_compilation_unit_solc.py | 2 +- .../custom_error-0.8.4.sol-0.8.10-compact.zip | Bin 6971 -> 8466 bytes .../custom_error-0.8.4.sol-0.8.11-compact.zip | Bin 6974 -> 8469 bytes .../custom_error-0.8.4.sol-0.8.12-compact.zip | Bin 6966 -> 8467 bytes .../custom_error-0.8.4.sol-0.8.13-compact.zip | Bin 7009 -> 8524 bytes .../custom_error-0.8.4.sol-0.8.14-compact.zip | Bin 7001 -> 8519 bytes .../custom_error-0.8.4.sol-0.8.15-compact.zip | Bin 6999 -> 8520 bytes .../custom_error-0.8.4.sol-0.8.4-compact.zip | Bin 6785 -> 8166 bytes .../custom_error-0.8.4.sol-0.8.5-compact.zip | Bin 6788 -> 8233 bytes .../custom_error-0.8.4.sol-0.8.6-compact.zip | Bin 6784 -> 8240 bytes .../custom_error-0.8.4.sol-0.8.7-compact.zip | Bin 6775 -> 8203 bytes .../custom_error-0.8.4.sol-0.8.8-compact.zip | Bin 6998 -> 8458 bytes .../custom_error-0.8.4.sol-0.8.9-compact.zip | Bin 7002 -> 8477 bytes .../test_data/custom_error-0.8.4.sol | 14 ++++++++ ...custom_error-0.8.4.sol-0.8.10-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.11-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.12-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.13-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.14-compact.json | 4 ++- ...custom_error-0.8.4.sol-0.8.15-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.4-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.5-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.6-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.7-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.8-compact.json | 4 ++- .../custom_error-0.8.4.sol-0.8.9-compact.json | 4 ++- 29 files changed, 92 insertions(+), 15 deletions(-) diff --git a/slither/solc_parsing/declarations/contract.py b/slither/solc_parsing/declarations/contract.py index a118b1e650..e7d2745c69 100644 --- a/slither/solc_parsing/declarations/contract.py +++ b/slither/solc_parsing/declarations/contract.py @@ -319,7 +319,7 @@ def _parse_custom_error(self, custom_error: Dict) -> None: ce.set_contract(self._contract) ce.set_offset(custom_error["src"], self.compilation_unit) - ce_parser = CustomErrorSolc(ce, custom_error, self._slither_parser) + ce_parser = CustomErrorSolc(ce, custom_error, self, self._slither_parser) self._contract.custom_errors_as_dict[ce.name] = ce self._custom_errors_parser.append(ce_parser) diff --git a/slither/solc_parsing/declarations/custom_error.py b/slither/solc_parsing/declarations/custom_error.py index 8cd4592623..34b7ca402f 100644 --- a/slither/solc_parsing/declarations/custom_error.py +++ b/slither/solc_parsing/declarations/custom_error.py @@ -1,4 +1,4 @@ -from typing import TYPE_CHECKING, Dict +from typing import TYPE_CHECKING, Dict, Optional from slither.core.declarations.custom_error import CustomError from slither.core.declarations.custom_error_contract import CustomErrorContract @@ -10,6 +10,7 @@ if TYPE_CHECKING: from slither.solc_parsing.slither_compilation_unit_solc import SlitherCompilationUnitSolc from slither.core.compilation_unit import SlitherCompilationUnit + from slither.solc_parsing.declarations.contract import ContractSolc # Part of the code was copied from the function parsing @@ -21,11 +22,13 @@ def __init__( self, custom_error: CustomError, custom_error_data: dict, + contract_parser: Optional["ContractSolc"], slither_parser: "SlitherCompilationUnitSolc", ) -> None: self._slither_parser: "SlitherCompilationUnitSolc" = slither_parser self._custom_error = custom_error custom_error.name = custom_error_data["name"] + self._contract_parser = contract_parser self._params_was_analyzed = False if not self._slither_parser.is_compact_ast: @@ -56,6 +59,10 @@ def analyze_params(self) -> None: if params: self._parse_params(params) + @property + def contract_parser(self) -> Optional["ContractSolc"]: + return self._contract_parser + @property def is_compact_ast(self) -> bool: return self._slither_parser.is_compact_ast diff --git a/slither/solc_parsing/expressions/find_variable.py b/slither/solc_parsing/expressions/find_variable.py index 3bbdd268ef..0a1275f411 100644 --- a/slither/solc_parsing/expressions/find_variable.py +++ b/slither/solc_parsing/expressions/find_variable.py @@ -3,6 +3,8 @@ from slither.core.declarations import Event, Enum, Structure from slither.core.declarations.contract import Contract from slither.core.declarations.custom_error import CustomError +from slither.core.declarations.custom_error_contract import CustomErrorContract +from slither.core.declarations.custom_error_top_level import CustomErrorTopLevel from slither.core.declarations.function import Function from slither.core.declarations.function_contract import FunctionContract from slither.core.declarations.function_top_level import FunctionTopLevel @@ -246,6 +248,7 @@ def _find_in_contract( return None +# pylint: disable=too-many-statements def _find_variable_init( caller_context: CallerContextExpression, ) -> Tuple[List[Contract], List["Function"], FileScope,]: @@ -253,6 +256,7 @@ def _find_variable_init( from slither.solc_parsing.declarations.function import FunctionSolc from slither.solc_parsing.declarations.structure_top_level import StructureTopLevelSolc from slither.solc_parsing.variables.top_level_variable import TopLevelVariableSolc + from slither.solc_parsing.declarations.custom_error import CustomErrorSolc direct_contracts: List[Contract] direct_functions_parser: List[Function] @@ -295,6 +299,24 @@ def _find_variable_init( direct_contracts = [] direct_functions_parser = [] scope = caller_context.underlying_variable.file_scope + elif isinstance(caller_context, CustomErrorSolc): + if caller_context.contract_parser: + direct_contracts = [caller_context.contract_parser.underlying_contract] + direct_functions_parser = [ + f.underlying_function + for f in caller_context.contract_parser.functions_parser + + caller_context.contract_parser.modifiers_parser + ] + else: + # Top level custom error + direct_contracts = [] + direct_functions_parser = [] + underlying_custom_error = caller_context.underlying_custom_error + if isinstance(underlying_custom_error, CustomErrorTopLevel): + scope = underlying_custom_error.file_scope + else: + assert isinstance(underlying_custom_error, CustomErrorContract) + scope = underlying_custom_error.contract.file_scope else: raise SlitherError( f"{type(caller_context)} ({caller_context} is not valid for find_variable" @@ -343,6 +365,7 @@ def find_variable( """ from slither.solc_parsing.declarations.function import FunctionSolc from slither.solc_parsing.declarations.contract import ContractSolc + from slither.solc_parsing.declarations.custom_error import CustomErrorSolc # variable are looked from the contract declarer # functions can be shadowed, but are looked from the contract instance, rather than the contract declarer @@ -394,6 +417,15 @@ def find_variable( contract_declarer = underlying_func.contract_declarer else: assert isinstance(underlying_func, FunctionTopLevel) + elif isinstance(caller_context, CustomErrorSolc): + underlying_custom_error = caller_context.underlying_custom_error + if isinstance(underlying_custom_error, CustomErrorContract): + contract = underlying_custom_error.contract + # We check for contract variables here because _find_in_contract + # will return since in this case the contract_declarer is None + for var in contract.variables: + if var_name == var.name: + return var, False ret = _find_in_contract(var_name, contract, contract_declarer, is_super, is_identifier_path) if ret: diff --git a/slither/solc_parsing/slither_compilation_unit_solc.py b/slither/solc_parsing/slither_compilation_unit_solc.py index ecfecb4f03..2d04a70a63 100644 --- a/slither/solc_parsing/slither_compilation_unit_solc.py +++ b/slither/solc_parsing/slither_compilation_unit_solc.py @@ -326,7 +326,7 @@ def parse_top_level_from_loaded_json(self, data_loaded: Dict, filename: str) -> custom_error = CustomErrorTopLevel(self._compilation_unit, scope) custom_error.set_offset(top_level_data["src"], self._compilation_unit) - custom_error_parser = CustomErrorSolc(custom_error, top_level_data, self) + custom_error_parser = CustomErrorSolc(custom_error, top_level_data, None, self) scope.custom_errors.add(custom_error) self._compilation_unit.custom_errors.append(custom_error) self._custom_error_parser.append(custom_error_parser) diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.10-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.10-compact.zip index fc45cb40e298c9742ce96b9c4804bbec36ccd2d4..c88ab3209e88b25e31ca209798f56b942f2ee526 100644 GIT binary patch delta 8380 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%0AV@ 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 delta 6876 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

2DRvIGgz_JRZCj&|dgizjpj^Z%ok z(m5aMj*F;*dZiIg#S%J1=co9aQcv~j(9QP&ExsmZboe!U40$vV_Aw8L`M7+B>Y@9e z&FrxsBYNuxbHW;)M0jeEe>Mm4O25^SlYD(Z&|@{d+>6O^>V34!p}ProbMVuQIPq_2 zNiq5YY*0~yuoustNllKoCQx7_ryT@l=Dhv~bO{Og!tV#y=ue{L5JMVD(YaU#hh z3~>v;GXjtZb12~um0Ky6Ks&Z&j7LW!Z9kD6WaEX`$zz!H3B6PBcQv0A)*;oy^c^QW zm%y5VrY1`mlONiq`c&e(A6<`6yPHf1TjGz#kpP8wtVM)7B%y z0E#NB%zt2$Xkf;T8ifYc({FUcWD{p15KZgSQOugYc_Zg!N+shRL;r|LeAH-%PmD>Y z|2vRXHU<6RSffX)g=eZOXmVl98>Ghbt!=5^1Pmc-W%;8&UM1 z=A^IGe|}@-zlD4_+{dsEdt*$_(X2!^a+@gjT+Oon#~J2gCZ(J>5j3dU(T(SgRNC06Y>Kxw zHPzCkr!wZ%<&0Ie+hCz1W3~P#e{S0)whp#S0YFrnbNT2Oz`1+h^}Ml`asujCKZzTf$q;#CH*yw z#!FlbFIeIs&~o&2_`ib24@J6^#_>zy_G-fgk*%&heYc=znk2hBU<8mr7$r{ejgQY< z_sxMXEsE!d(*fSDZ5{l1*(2+S?aoyclv38}eH`GQj*8%<3k|d$DA7o z4lzn1hVvV`h5AAAWM7!ECv}w-J;@jazqPs1HLz^sB35(x_C}I=38s3fzdKB6d%aJIKFe-Q8+#urykB!v9hd= zBB5dM;lA1(E1N6D4lIim^PA4hu&B~;*0s17fswYMY2SV|5mSP zt3t!KE;L!;o+|j#Q6TnrP&-CGniN!BszHhpF}4iHO<~_xVJsCp8_|wHS5DEf!LEq!BSe`Nv=7=0SGofd+op92u%q+jZkA!vbS4Gd;;ii{Z5SA4M6mk1Z|a_uBT@si+RkUzLuEBogrqvULvxrcC;CAT$Ex%e ztRJ?p+{82FSLkFF>46OLf5PjLDU1aJcE)4cXj2eBPP^e@lA}X4f zN9|Ll%TlfocP2GAM+00025i$%Qv diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.12-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.12-compact.zip index c72629231a104fb261b14668088a959ca8ac3876..11e9f5c76912eceddbba4a1cba15d3ddb2c1778b 100644 GIT binary patch delta 8381 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

T< zN^01@9nPwlOVZ0ie~`GKxzB;s&ZZ_zL8MQY`EluJ!slecG;TE$;HhExS9?2=G`d=A zfmx^LQdG}bVg{ee(dM;kA%>`j%Q}9aIQ~576K0})*y8{vBdLQ)?i_U<+DyFo>zpSi zqO0%dA_PG98{UYE_F?sexhc(?LN$(;We0t9|5M~$|7(AYfB3!QKkwgGa>+C;U{gNw zY)L1M6Q{fAPZ}%+z4-g|rE9l?01p=cI;gOIPN1E{)rD$`L0Qd)1n|a;LM_@CaY1)d z6Szn3yE2h+_}9{KV7R%ZC7>3LL_<-O8thNpM#m>!=MrA zHrKvcwNfsIB+z^+k;m1(*Qb;pJ;g0vk9N5Fqc1dt-h(`j#eR{>7$}uo?g61hUiBld zwhbdAS`}UtgA{QNN1ZmI)QeeIJH8qPQbRPVh~A{&~L?$5AaK+{fp_O{BN`eRD)Z~BNcMlUFlsH zOVzvle;6ILdI(d6OyI6;2Gi%;7Wi!igN#E%Y_}S*) zJ_PRUwY#m!qXw9GE{yH&N7F!#n2}MZGoPAJr65rRGPz-#*Mau-I&fupoEQ>|2QQA~~Pa)bz7NZf=Y=u>?FL=bMA zOa7L*yo5d9tK}bZ@k4{Slg~blMY)!;U1n4c^$O1z>6g4$h}btpZ!@WSu_NHZM~-TQ zP7VvS!;YEGmdm!J(-o;1$1F4JdW3(Fe?r&qUV0Agin#qhy!z2eIE72qB#J$31`d89!uSuM;y&bxWyov6n%Jh8&>zy-C(dM&2$YyB9LFEjF2 z>7qIDa;<19WDJcXN;?xIiv>LFms9=5$A)Pfbx5>jJfDw2az$;Hu~3<%dUo9BAferN zJtuYWhV+vTxI@Q6#(0#ZYM_*ZZrGl=dzXk=^6VmpLtwy(F4$1LG|AiEe+&hh{_1)l z$+?c6iSculk-Wqn6}-WPI~DJ}QZe?sjP*-5MM;+358&iIU{HINmsG;Nv8}Xd@^7o| zN_$hpGwq;#lR+#o+|4Y_WJl=_nEd-SVJLHQRxjw>Ok2-TD=dNV1zyA*JwSQi6*4)) zm~KUSa@+Q%A?jIW2(IZne^kou%9PfZl4;?$mg9`ixoh4G>EXZPz?hE^Bay4GsJ*0b zB;^R;AJ?r7vuMZ;#H^Tc?wdQuwUby0l;aJ@vYR@NfU1HZ6HiBN|8i>yBoNxrK+afH z_O6}-3g7D~;-iALDL|QS*t!DQ14x`g|MMc7rcg@(0zU&k00ICG5CErxC09C&OC4Px T003kH0h8kzO$MbP00000_D@JE delta 6874 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�^)Dj4cI?#gjQfSIgHf zBH5nXgUS%^M)1koqrpfUdwBs1$fR@0>zhzwt!R#*4~e=0<291MPZ)mYVT{2COpO{S^e|1}r;im8%Xw8U3VOwQ#Or0sWw=a|pJK`)$`E zI(oK=1+v?DoHQ#-r^RR#mYq|nSEyG{I^ib8qDe@k$waaOe{4pye-VFt&Lo^MUBUG# zNBzVJs6+VF362W}&^a7C+WjGct&r4vD!C>1a-2YSq--f9t{}lUD&C~I2uwbmEgW65 zoZ5w?;+*PK{!uhN2MzEZ)BI62+jj1_m#>h4Y;;Qo`#B()^Nyf*Z@X-XRZ1n16Kf7J z@KSh+04-S$H0Y|lQsgbTwF&|!M4CzZPB-qbK`P41Wt?Y(V3vpxG|5KY^8Lo9NQWxA z5YoXtX|2rZ4UE&v{Rr?9P)h*%WA`5;XO^BMpE F000Z;YR3Qo diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.14-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.14-compact.zip index e36f5b94e5e637d30c007a838d1973a3a475b88e..fcb0fd1f45962d39dcf8be4b010550efca795f17 100644 GIT binary patch delta 8433 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 T002w_0h0zBO$ON@00000;gfrz delta 6903 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.15-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.15-compact.zip index 1023ab1d451e7a788da134fe9f6f28db15da28bc..2050e256abc724b188f0f6edbd200ca617362366 100644 GIT binary patch delta 8434 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.4-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.4-compact.zip index 5ecf2b037a0580e075113579ca1b9152131a8eb1..d31650594ca8b604757ce2c0b3d26b27eb30d257 100644 GIT binary patch delta 8082 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 delta 6699 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�_+*>%wDr&Zv96WNyp+$P{uiTV<1k!o zJR#`?jtm0SJJSI&Z7(=agR)w#Xn*V^+8nbZm-~r?4d>@V58i3N@Rm1v6*g7u+{?{6 z_VSTJ3DQ?{PX7QxXA|i<;m22c`p*+dT?8+NTy-p@wt=ukKbeGDyGmt$UrZx63zOE! zVUnIk^JTg}>Z>}A?RRQUu=nyd0Ux}QMd%$x zn3}!46R~4|LR+7DyYk+D@X@^Tc@pI&!^u~qk9Gi@LoRtS%+IDojp+^^y~$FUj2^!) zK)r3nCPIu%ubypPZ4&PPL+I&QFV#M6DujQ~hZTAw9RJ}@ov$|DbN4tdH?gqW6@#G1 z20c-cv`v!QdYRC_U>9cDC$2GInIBx9mamCjuAEyEKSH9iO-!DD*vtvZuZ)cxYp%i} z6EYF`kKC>VyB(1G9*jv@lqmv0!AwkcjSmMkzzU9caH4_Y9XW1Z&9`$0ZJDBP_16If zZgUyM%K=Qq3@KezCf%tTOHF%mQJCbxj*%{V0*TlRkz?{u=ufTd0%mWhc&|iM#lViH z=JQ3PnBIYWJt3igf;PbnP9?ntq1IhL7P8pY6m01?n8yxw!~}ADWO&k2mW?laZuO%;P|dV4e#6{@=91ZO zes)By`SsR+?P>2;@o9{Vvq|uXa5}dtrZgO=p^}von%%C(fS6EN{cUw6yb8mnwRB8z z+2zNcEoKvubb&Pzt6KASlvSI%bdn@=N4oG4(fB2=^N z(RIRqAbFU>+|vfFp^aRjaV|yK;B<&l)>VdW=6beu(M|rEw{;ub=dYyPtXVSC8Tb#VV=l6#Vh?#K2^wNPS`2L@iiulSt;R-3&?J_)}GjEu+^#K)bUMGKpBMeUL# z4cSRuvjaqC(dhdU<#0?-EUm(86ktz>Y!%Mna=X)dU?nK4?=mfWtlG3!1k3R101uKm z8@TuS*2AvM+wo=d3BCG4r?*J|BNO|7fn#p?l%NeGxHgk{y!oSVPt=vo72K?HkpWAw zqBI8cZVVW{p_1~1%7df%&SqU(T)4J}__9%?x-?8{l2VCKTbpp(F3^K^G`$>yhuKzBK^Z9xFU4sXIoTcXj^9?M}}Qdvi?SnC>8+;-=jXtfnH!LQ&XP+}Cz z^b*woE{O?TI9=IlzD0`AZJ|(#wuU-FYKk&HqkSU%9knT6)|LtWYykso6zmtHLrWmygAw zXt0WhHkuyBALbJ-d7e3c6S!20b$?8EDN#|)rdG2yY*7}2@FN_?kJw?W)!s*S#vWUx zZ&wl`zE;`KJ5fdTB6I#PPG6vDvcJsyPXqZ&S3&VQTD5Jy(_ivHb_|le|M$9|?odks z0zU&k00ICG03E*%Rn?6<(#shD0Nuv`04e|g00000000000Du9Lq8~m66B+;j007FA B_9_4X diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.5-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.5-compact.zip index 357554c09b7ecd8eb677f0f235c36a6942571751..a5551ea0946a88a0436d0630601a326dd204ef28 100644 GIT binary patch delta 8150 zcmV;{A1UC3HK{-wP)h>@KL7#%4gjWuC0DX0nGJIv001ui001hJK^iTQNGX3Y^+P_6 z+Z$mK0g+maPHU8a{$#J8tR~ z(IR&Fk;Gl}$w$fdCaE%T#Hi!ZD!s9=LlwJ~BChZSBX&2}{Ls){+pdeEe|w*Rov3l) zM^t&u0#XBiM?pr)-hQhx0_lICM6e0w3-ckl^XaS#kOeRdb11PS51und=EM1a zPDMMY*DZWZsRS+<0`7vh@uP9?4QmRcCbmDCt4I%}qD@2Ptfjhz=8E z;=K$wW1Gx^3~Vq&u`n3H#`CnX6qNjoEHKas5tKPXL~aKw)KBwCV($`9n_9TudyZ*q=HbD*Yvxd88?#VlRqs*M38+dB0?(>$2HQl zOeNHnFWIpx!lE)~O=cqXGJl!ozV_d&Q8t+ldT@o)Yd|-5{0K}$#6}>g$QI55DWH8Q zC~|%%%Z|y-QC;0SSAYdk$J3Y^v`hZqmy-VD8cakGj%{c|_(Zzap7p5=m6INokqszSMbm`4 z%d|hm3R8PczhAjs(7bo%MsZj9b&JCAyU53(N>hK9Y*j>Lg)1bdo5P#xUL=1(ORWh{ z)aIR|aOKTs1Xtxk;0sn}CFSB-=1wd?*S6gb(>`F~H0gtHZNRop{Y708V5bFwM^Wnn}Zg#>GM+1!r<`gvJ{j(^s;g)L7w)190g)Ad?4OefI$XTr8Z2Bs6l^q zMoJSqHK;_r-WijS)B^_1B0V}9;f&SHrrPGbX0@S&oII|QI0HNRP%R# z*T+xv?wp=43e}+_{)0r9_6t7fyEk3?f*ddMX_;Ah*|msAiD;&z*GwxnqX6JOc(e*&6OcId?NduSfI zqi1A|GP>u?n!0Vec|&!YG!|sNx%#} z**ufkgd5Ep$_5F3@^Oa5TdcPx^|__3!9h0Qm ziZ#9GNa(3U#_FwM&GxOOY4&h*_wYjzqjC^)6e^BK0WYJQTBFx>M@t8P zHd2I#RIs9Z*+H?%_ETKf)e(OxhCCrcZEsPwM>yYPI+K3wDmE~UU5~d`ENm7Hg9GbD z!5ljkq#}|kg1?t{T*N=a1jW-y5Ew>>SRnwJ7+ubL@`rc&Y`bEZ^@2ms;^DxiCU(Ax zlufZLIkk950MQp=d70u%uh6mS8)EZD}@82p_<~NfKm+Iv3KI{i{p6 z7PV{(gW&G;+wKpD9x#92iXWPTOPHyrHr+N>$hOV>7N^|Zo1OJQLCC~b5O8Qzz&~TX zL||#a;LJ>I7&G}7p>!2hl~~lMQ}|o82CX6BFW3lgw-yXi9>)f9*6kf-48@R>ic(UQ z91bA$W5&uyvEdJv#aAvVvaHhWb|ns{EfNc*L@aeM<~g|{GU%w%Yha;v*cu3@7Srtewp&toukV8Tpn>CUHqVC-_99wD_f3ZrbL!%UHx114MW9 zB0}bXcKT^j`*(ls93Kzxh(i7^MFckScizT;+P=1z5zI;1lpo&bAn$lwyX7)HNA%&g zMS-98coiW)7PV%_5 z1+xpoC|6Ca6vvxWeJ>hVm#PIpD8sGvFAvFS)TOYh}GGbU1P$0__h)!yu9tufEzJG%;FRH~BZB)s?u@z%~ezuji#*wuK@k7aXT$ z*+kVmpad5`#J#EkVK%IcR^j4q9YU#S<=Ibs`DU$&4cee68xJe>sYGs=K&w3_<||=4 zNCJNt(_UvO^s8j+gf-nER2{B85#gsa5)8m?NGi9Kb!u*D#KG`^7NFz$wMMX*lmOr| zY||6^ROwgP`iFd4$Gt9;P$5ni8Of~3&jWIsh7Zn%cdWW}4kwW{J;+T3HM{q7GN-Hy zzxWJ>4_%~%-ikPSQ2J-D_#v~H(qSEH!Et{y;}LZG^*sPG^wL=v)Y)%9YJYx{VAW+1 zwG&S?x-IL+AJD31e=G!pLWCRHjvzy~@LZaOhwH-j^T<*J3-tkG224GlUS=pCR)_;o zm?USZTge!3SU+L@N)%W%7}_A87slE3ibF9>bwQdcOv}F-6z zj`a%mS%-czfoBJ1cpQk0-6Ky$U(x1dDQvt3E3#aeX34KGD3oD2D2;C!pz4>pti#VN zy6eR2mFk<6M=bRvzFt}OVsUy6uzJ4%^jD=KhUHUo)N*jVJDROaNBq)8tsU?tNGT>X z$dfL%O?21(%SUe%YbAP9GJxZ6nPq=9!CMIiC3z@yH#7HKq|B`x>|YAL*oX;OuU*7F zbTpA$QmPBs14xc&iWE22V2E)eG7a(kJh!hOL+smXx8CE!eZSP6raNw%vG6UW7d>Nw z(ji%gfv(vw8Vl`z7b#JTB4R0*q|k%j?2YD$FhV6ZI&BOGuUxp>h0GhedzXKDKnl=P zKurK#Ig{}i{@;J9*X*9adgnL%1wv1{*&MDe+-QH|cE*sFH)&lD@s8PBFQ5N*i5T|JuW7;N0miPBfFT#D z$K9P5jY(IfsRNu1bl%Gy_)+0q*!ggNCleHYynj!Jp{jv^hI@9QD5*Y3N@>+l{#r0HW z<+UKkWm1jp1}P}{>?nU4?vWSuua#OBCtI%V+Csb2?h&HB&MI#pCVh3^5c#`G-|oc~ zJXi-%@Hyb~O~lp&Hv?ExYw||7L{%@oFOz=G;^4EUiUq`*(QajBy6%f?$3;j?R2s6zln)j0vwzW%pa^DT8UDr)+qCAQ` zcONrkmfy}jEt_s>+93T{0z6z8Cl0n>C!OWbhOPm?>P@j9-bu(k?!cAG+`9y`fM^RJ ze23ifT49s&_(Xr9DD`ks<)3|u6d048iUsLagZd}pZ=05_^~ROWN~ZoV4F?ND=u02r z;vpC46tfTT|E63JZVs!*ir3_FSyiF75U%{joqP`4A*mD(GtYy|pM7yvveX~{qD{-L z$Vrv(>_|?Qat-CG@n~46K|So94+8JzL|{=mN(VVPzbJniCi_Z?cCofj&_B}NG0h(U zji<8w(!+4T_02!R@CmP-z3BHfV38w8{`(-YDdAcy3Hhl|b`bei;f#X{REXd^FRkjQ zUmS+2B&oL!=Rby!U#aNOwZB@80C!iX-qA2rbjpdnoz^pkfqFt`1*7_F&N^dSY1NK6 z5BJC_4EKLMOLuz|ypJ)+-_IARW~*3hry3yvsPYVE6Tf=bEf!NZ*)g?bH5 zvTIq@(w!qI=%=xMg@eO1F4X{$QfH32&Hf46A!hm%dKVHYl7#^FWqR=6 z)eO&_FR$Vkd^ziT@Ke>uo`9s2+$_VDO$%<-Y|DS-jK{ZC{78R)w8n4d!0teGVI>(- zo=}fW@fZL`lIa=9-^oR@4|u)UWcVo8->Bv2DqVL4iQM*!RaMNYBzk8@_aVh-2}c5u-k`)vcT3$b_$}gDSzz* zB}sp{LG2X?Ou3^g)u3-{sN+lm5MpnfCi_rXG|AIguZ+ODOLk=gLv|nmYcPW#e!oE) zoXuf?iQ*KO%FhHx7^Y6RyE4HgICn!bb6+7NgwWAk&KG(Uxbk`p?ZQ(?I3cXfhx$ehCG3`WL}+tfboZ9pP`xw>Qpp!|`gh4S8b4~^1PSM-xvJ+(SNC;)HB>uGo2NNn0M z54Pf%BgQa-qC@M~#JaTdJroM2A4Gre_SBn7Jm@6RlS?*#!G-C@+UG|N7sp6ZqSuNG z1%L)(gV?tI7Jhwn2;Ne9lr6?D5F~-D>yAa@m7$doW`P!g9f^3FD+_}sJJy1WUcD?g zO|)3Eb@9|JT+X;1@N{m{<^ZV9d&c^b&sJgXi0AaYyR>ul$v24+fl{wY|l-}DdpALv6R)& zK&8}~v2~v}10FQN-iIk{R$PCLZNRU+$6jJK%XaM6B3AIx>-zxgj3BzkdINPbKK}RZ!qPM@g3YNA(;45i9OXNEjE&-~H#)v@I9Ef3sUrnGcgiYXlYvwiO<6(vi#-c%r`60SK)y zoll^(Qb6zfa~GUU8Xv@7a)H0wVWe7Z5>1l1#AR<0-kZ#T19?~DMu_EqZc`#Z-||XK zi9M=_26I&vkm^}pEex#{#*NcmV7N$ljp_`gg+<1LGlfe60m*+^hUor|@k&G?a_ie8 zBhxYd??L+?{BMb>GK>r|^@ktOqG%D6o6`x18LBW^dTBtm%-MN=AIRt}4s?SlHQWev z`Dnn$7U27V^3;N;7Yx0)bR@~#tJFKDp&LLqh1#cb4&1~0b1U$~yarq#Ua*~`9gL8e z{_#h%i0SgM{d|AdjV4<65{p6!Q#)gA^vm@*IP~7EF=^N2`M*3qq!3)bIlnwwLbv4O zb_Zb-0b0Tld;?z{Znt8$LL6j4Ho|^RHz>W45HeL7%gGbFa<|$V7q^(xl#@#y8Vqqd`4n4Mjhd# z3JJx-ga(ZW>uo~$EN--;?ClCXb}Mo}ERMgN={LeW{(B>{rbVBE82%Q$3OzV(NpJp8 z%zn(9;l<-?PLQM@M_E3g^55>+JBs(HaN;@vfYzHzmE}z}P)%3pyH<++!Yl)|iA+6W z!S?hB9cX_Mm&xuY9xh6mV5_u;O4*YlMqfotQ+Isd?gYwGzpY>Wvf1b`N2qFb$nQ)@ za1=Z74;w!&sqO>}9PC9OL>Eu~p!`IrS@V3v(M3@jL5(5?jGBNd6?Du}xp>C&!!;oD zr}G~=pD3-Ssz?IHy_Dt{Zqb#D+Mk{kM(mz9MJRunM)@i+R`vq5F1+Rem)D}x(AkU4 zJS15S`143<)`sIm`LnZm3f5W%Kc7~dr*L>M86(5@Vi()f+fY+hb9kuj{C|0&=~_jc zi&U%u8=vUAK#OMa14q;V?ltMc+IUHGk(; zZRUR*PKqDuo8~}1)9`?Z?XN4Hg=f6pU;vJ|F3OC`NO+W81%fo9dV=_B=YpH95`Tnl zJq^rFlvA@CsYIk)vuhv|b8NBAl@wTx!!#X$dW**NeWg*>8$dj@6T~2lvZi55*b`K?goP1|SsYCqQ2Zu#joSF`sjT<7 zGh}=3ymtY>(ZsAq9OsNGrye*%k3WB8wI7P9=T!amR8I1f0MjmIf2}*zh+-@E`H{XI zw*-%(qTBY^BVg2@O86zoi@9g?$*fNo_R75qfkg(0u8Xg{!L6k?1zV6WqGX=WcT0<506=KpFjJ(_-&ZLQ2qRJcGw@~6gbv8a;>AX&KAvdSz2q)~rRf`Jos zDex)bwAV&8n_J3pT-xDhwhMYCw-Ny23p`iKnoB$O2?upjsdyVocqYL8i(4Z9UCds^ zL;)iUa}an-FeCUHEYUac1VH?DaSGQ8f_jIqFy}`Gfi>ab)ilMAK258!nKXX6Hy z>K4%K%M`+RbJ{BV9!&?iXXvwhj#PUthjij9^d?r6Ct(zgE(7~)=fQ5-uSZ^V4$24# zAkPSpTvbHyv29`8_esN1|G>um0&bqk#(mlHUr6h)m1joa!s%6pFx-Es3Gj#f0VrN^ zgjabB*W`Mm+fbNYX3N&yZ5DA(O9#?IN|nFaoEjt90rz<9I@|_1SRo{U!u5^y;XdPQ z=s=u*YGb-h!>*vdf2hXeRg-=sIl1rJ)^h0(yua;jDc=krLfSeL>9HnLhIT47{5V); zQDb|6Cc{r>i1SjS1_*z_1d~!iPeL@YCqIX)I~lX9Uk{*>^3+jWL$%HNqewtscE0`N z$+_5DDxBYzeX)-BioYs=ha=R*o001&QTeTaix|_%+ZL(C%UR(&WPBu4p!6rXs;6@BKhD>_wn%@=k)u|7YEMoIOFfqE zFPBr7$UFrz;yq$!Lf57nD}pxJ=DvI9Pi8nXd;ko?8~4|d+74x6rb*;4#+Cho%%$3E z&FOB}$Md4Qg~%#-vJR9jsDbrBSlSOAn^8kB9SmA~BJ+w*7o zEG={1&EE`k7NLK0_-|fig-bQ;zIIMPvU&j=?-O;e=`8)3FNF{*#M~E3Z}tn`(fNcE zFfFiJM`|otUKTiiy%~@gptqCppzLB-?Ud@f)ISwy{{bFMtGd1K=b-n@_R&GFX*vBe z;m0UJsx!YijusLrMBahMwr~y~#umLJ5Ir{Y=E$%Uv*3TOdl24(4{bPA8C0-Fv<3E* zuF(rQc{3Kod3(@ObP|`Qp~OT-j7p16bIq3vCHR+ihdG0`xzRb<#0f9Tcw=&&560Zk z@ZMhWAk8{Q&N5$}bh*Sekrpq~xnK(z*Q#67P@y(E%5 zWC9dqeA|J{|LI%d%sB#NrwrmK^$9Q#(^D6gQ+R(070Fj|B_k=a)U(^o^xhQ|u%FS4 z=D-Lc9oC(snJlp;ol>FUdw_hKT_W-cm(Bxos)5!-ecWO~6LBCY_Gz2kW>Nc(Qama# z%B!Vz+_5}z>D}%-(MhI1zLX=9B}ieuy@bP_-2i=hPBkjcz~YIi^7j6NH^@KlZaJXy zUNC?CgF&IGaE=Mlh4hD96RqZf%4o~1H3h)dI>)^$`kl{Hw`JDo$9}1MgXyRzJLy1v z=@?j@;D`w@okTCnshw0AbdrJLh`p6Ykc}A&>_#{fhW4B3K)dLigPBnRSq3b{xk7a1 z&ezy6>6-lh0*NhXWcq)_Y?lnAR(H^N6MiHJ$+I6F!~6TD!9 zolQKP?L;>8)`TwJ?E2eNw;##+1}bOV09eDe#sB~S delta 6699 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 DLBQsn delta 6706 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 I8UO$Q0PtJ)_W%F@ diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.7-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.7-compact.zip index 51828bce7f7ce019e01f805587051bafd85e344e..95f411a302a4cd64fad7edab9931aed31b20412a 100644 GIT binary patch delta 8113 zcmV;iA5P%+G>bqOP)h>@KL7#%4gjWuC096p0`^rO007$kkr-KjG4(?}j@uhy5#!~! z@(Wg;kM&3z^RO>c?wFTIrx4lHba9<-2)@n4afNK6v6ig?*cv{9WIJx^711Jg`H{q3 z^vOrb_9m$^aKxzN(JH;MutOEQl_IY21tWGh*Zk1XUE8jUqJPdofSssu;YUq&b ze@8(^%HDpfG6Ly;phU0<<_q&7x#Xf898u`4KlKd9$S``_N96mhcT^@A)GKr7w~b2u zT<4W8`UTTo-H3qBaqDqwYW&-zIK-KtKG;xl+2TW)<1%^{s*tCVk8ks5cJfi=VpU>b zB64m1YGwo47ps25GLh_6<5z4trcj{m?ohiNJJ{>hEcNLwB7Cb_zJ& z5Y#hP^2_Hi-oimz`! zI8;|m)3QP1CDxCJGE4l0hrfl-UIBYr-gVln0t5*z5F{v`mhUz=Q62D3ig5 zBFu2`rqQLe%UxiVyirnl+aglr0P^Mr%CWR~Uihzs#Y@(EmYtx}d$dtj{0iZq|Jn3Z z>eLK>*Ic=0y6E*eR0C^jLygG`cblBgk8V*Sis1}9K!UwQ~4Gxk0<IJ83DQ94zU~D2)puCeb=hY+WOM`p0WGk6vUn)$#XkQ?*hZai#MH#V(+hE z=nT^NHThH>@#qJg`DDA2^MMiHr0{k5(Ob750JK)CB@eU(uk5)=sMV*8<(}q$nxt4q z|DOZ|!gB`au?8kfwGH6c`n%P`H`r3Jhj9$evndLaY}#?)?(0yq zH8<|=8TZYa47QNk7O$nSX<4`w62pVdW@E0L%n8Odr!K|G2GI;2?Bl=%*Iz~eL4C%G2B&Srg70B2>6q` zynSMrZ!-)LjNM!Bbzdreeg;cSijJShAlEnw%3$iuqkmmi{rxw8#X-eLzAc?+6tpnFfs%k2aWEMhOXJE5}Ok47c`ziZ^j`J+_ zA0^?s^)$7;Wkd>p+Lk%l2-IK^aq;?DSa!19*;d&Tt4%1QrWZgf`3OZ7-B7{@t5bT* z#}U#8Y3`&uApbS1WB#tQx4If>OHMQLdo4kq~>eco%Kw zm(n=>wzem2s>I$GML|~3Gr(b(NdCBN4Y0Q6`?JT5VPk`g9*acwx zPi=KVp5!2ZslP2WNHcwy(FK3H;HiMk;zfQhKlgj#Od%Cj@Wi3h%Q=X^82)5&%pNA^ zQJvolC<}J-Pap$HO*M3hTSlC#VrG$@5>gkop^TyB;%!ls-XYR=ItlG)6q6&$?bd#N zmU;ln*yM4i6eiys0G%m80&*Oi1250HxPY$r&|i6fD|q+zD{sG1I6kZ;LPPebiUNnJ zls2UTW14OCQ8X@7KU?l7>&0I5^6O(bC_0>*5T41r`=#h?9BBa~y4SoF|KWD99>y$F z8DV$Qc_qgIG>na@%8jjKgq&uTJskGis&$2@1 z-(ld5+ZL;DLWaetQLHSfh>XocMat7t@r5;#|7$1*=C0K!@wi9um2Ix$;BZXFs5!Ll z+!k8jY}l8k*`;XJ8RM>aGo=^7GN#m7Lx9uo@ zB8Cv@ou!0%h0d{K{jvJO2tZM80(J04glOR+x(KFeS{EzQ{MMxbnPJIi`zJ*HdKt!_3BiYNuk(_V}FBx@`VR~aI_o; z^=8E~_lfX|rumZ*5;deu*q}RZJ!ih#9}C#jFpPV~LLf6H9#`HB*zvUGOOL|Vo+5rW zY3`LmqrjGpfn^X&Qq5f#%vZklF>ITpd%$-GMp-Psx+F6KsdaYY<{h4HXygDP3_XMU z3fInb$1E26b;ltcMQFH;I%P+H#CA4tbij~(m{WRxF2Tzc{2ziPS)O7a7|je@g4xyj z{k(gUrexy^XdqoJTqWOSlx}&7LFUX1DE3Qxo=^nTp{xfzMhgnEzN@E7ao3%t;Jkvx#LXkg0Z~B;#YP@kE^CUa%bFgM9;LKY*S|ump zTks(M;*U0nKza`zTb%^EZ&nH!5@rm-svkQ6!f!&S`U)GZ8)gQ7FGt!nDUn49)3F&*L{Qku6$3RW`$8&fPV2;zgOr3}^{lk+2&1B%SCA!eK)Esj53Kx{b8It-4-V$+HF65u3)Pi z7qhY|{@2A*E5vQCw;0md=w&kUT0`Tb>AY0T2)@B%AkKIi?8@z%!Ec@!ju42khr4$% za_py79dF0A21|(wu!(_A0AW$py+9>@{?r9nS z7v}6E_o-LkdyAr^v@B|3fI5ey!jtjJd?hK?36=K1V@V+c#ij7vbBErXK*+ySGfMV| z9`x|scH*L{8TX*QX;iU-Ydw+|rNm5|&tKwRP=DbRzJ70G_iw@nCWit8#@PDl$nfE7Ug% zRdJi{^#`THZuxduk5^J=y>dgZaQygrwCf8ZOL2RF%5J{o*llHok^4(Pa2fEtD=7cAsWvVdlZnDzk%oD5c2L zwMKA%g?N;$n>eAnBdMg(wdkfR>5<#YB}(h#JGPE#&{pe5SBDi#l<-qdc(GY#-jc@E zmkKLior5E&sZHhxn}8jq_JVezf*q)=#SxjD_BB19t!5rHlu?;Kz7$}LY60+>-d=P7 zlp4GmD+Y3%jao>-+O$evr*EQQbD_qa2X)1N>7rBGvxoUVo$U!($;yPjn)$X6pSQ3s zt9JNi&%ttGGTv~0H--1UgyRt}Nubh(4O%^3`>l4SL;=a0o#NZkH4^xLaFZC_b!QZM z%_tD_>39--QCrrBJ`E2c-cf;0eKfaxqd(X@0IYd%+J-1q5WIgzdJ2I|8)$r-^fnNG zgYdL+Kx!Zd5`D}{Z$9I7i2tO(b&$I)#BX>>NgB73dY_|ozmF)O^iY0ZlCxFoI@*PD zHopb&6Ny095vc8*6ir;RGh2y&1N6VKI@PC6t3;o`p;}Nu2=6t{ZVePvXtJBO zuPtkp{8+I*gtU!s=p(vxn*e((eRJhxJV#7ux z-j@s)39gHs>uG79fjLp56Sqy<(5n8JVOciEB7dwfb%Pbu5T6VQu|G;xAZi|8)vCCf zQaSrIbsWF4AgHbD{s)R4YWQW*gU#O<^+BmAtzG5!!DtYbyMu~7(mZ9PfWB4%KZ>X3 zzCYkq54aIAPrr}x_7R10-``w+?zJTis?we!wz>6V9SM|Hv*Uj23cAPYv7dD!xQgD; z(v07HqW;%`yAp0aGzr7PT3ej4zB%;xDv%qsa)OT1K}Sd=)3bSi z`U{VPytG`hQ?KZMgJ_I@tFOX?&A98$8@f8V<)3PydLdG27R{wHgGL^-PgQ(9?g|)z z5J2O(n|0YFQe-I8(K+sxZ1i_$4}M=vr7q+Z{I#7dj96$ZnstzWuD6KVidNO48G!laC? zM*C_2T};}EN7z??_PFVUz3$q*V~-tWi*6d6qM|+}|3#T?65jA+a0YqP2qUd!7ONm7 z9~gQUfAYi$X;h(uzO&6=vaYYw8?~1PeMn#O`FOomaL=3y$_z8WI;|JFpC`}WZWINf zbY~k^U17^5+{M$h&Y0B-8=Os6=6QRVIN~!UP@<=KRr1W}Tb; z`8;pg{l_MdC=@mH0u-9#oHChhEQVvL%|6Tfe%6j5v>OC`4Jz%9qs>PaGA*u(Zkpt+oG+-7Q1 znxZdOlw4PTHuXg*?^7}7+8+mh;Y$*`m*5RUdg@O7V#%nTt`nZX z9XoARwk_)*b&}Wh_6flsgOAZ^F=Z@NT&W{h6^`v-w0^5MiW*qowb@V%4}UPRqcQm8 zej5f`OWh3ix2L~K0c0R;%D@todkZZ2&Lap9uQow&!L9Ncu<0oHfQ{ zH9ARh?O7CFNdS|H|2R3|;Jd3O`9wW4;eP#pgqP@@wiRMvoeFvQM}WEmJHVwcT7EjA zabEHBG>qH=2Oway|4if{o2R%R1*DAGw4|t8noXOms&cZ^#CJOsAefeqgaZ=d26p_I zwl=_$n!PgHTP`K$BZ7ll*&#^_l>?PgSBL<0h-#+80z!%go9YAXOP%&*!1L2%uN&Ea zpE7lF%rFN+BRPgM!LI5sC5|2?z4@sHNAn(=AMZYGaBngD9@p2vv*F&BX!>6jiM51W z3BAq~qqq+X7qt#Kddw>mOg#JSf*|sS&;y5TZE`&IEhUJ?Y(vp(gEp+8qAoC6*gDew z(OzBh6D0(pe{P*XS1FBi;PlLfkjvkHeFY%E2$G){9&r{)lNhNcVL$RXZ`!S*0w#R9 zWXeO`-OE|-R+PJCOaqE!c{}M<DMa}Tr@#9%W$6T2Cy zn6K#z289(htl~XgDBeRXiL*SD(D8Pd&hJF>4!r_u*xgy!9vRBx8CyHP>QUJo<g76! z6Ggtc#fjCyZQE*2s9 zW`L*sXDOMa&L7_i#VRe;Lm=tBg;Q;I7Z(<4BsW!LlByA^;5=s}ogBK@0B&Xpa*~gY z_aSLBF+>5D>=K$akK-cU1`eTyOr2>soytK@Wg(7M=%<8A(ui3sRttoc^s?2_R$Bl* zW5nq?sqtHj+(loAY;u`@6;M5Z3Jgs$Fy>!y7t^@*YfJA=be#<*yf$CY-QYk?&NB3TFxlWWtM>E zTZ~)iB#!Uh?Og?E9hzSSfpXWY?Mc7AHKRv1A~H=MjVG-v(8aaQuPH&SBz7uNX;Gd0 z;I&1cYA|gg4gr3{4#UW{b;MN=h z0Tc>u0X&fNZ}CvY9#fkU2oox9YSQY06KnWob8NKV?>GH_2Eo3!&_bgd=O?vmG#=MD zV>==Udg58>AUrSrUGMU3KQNL1rbZ^r)FG6y?#fc!9+Rrtw91Ke0kQK;ab_ zK%4Oyn+3YgB{?g1t10cQ#@EB;!66Wi1(0~?2LL;{I(&D-dcJ!Juf7||k%nS6k4!J@ zDLs_tItX2VogyOUZb=*Cp*w3)i4x6gS`GoL(%`0iIYgkbpF&aQydaCG1z+sIZj+Bt zV&A4XP*NemiX!fM_=RDAl?1}lf=-{fwtjN&W!e%R^IkB9p^fZqZp6;zA#LX9W{pfw ztj8MU0KbTCZ4u^9uwGJ;=p4$U5fx~Ttf;^2W_CA!P3&(;XoNfB#ZovDf1t?y@^|YM zH=|l`(O~yB&qSl@h-H7v((ry_`nZ$<4ZePp39hlq;s|~v7by6`iLBKcl1%R zpiiX$!f0}1ydyS#X~BWhC=3*B2W*i(b+N+}JR znc7bp?bNFNBT%0*L;abeL3<9-wy98J=QUIib=aCenulGA<=e%I;FROO=$~6+LvuD8 z5giy58t$RHrPA2}G!N47@nEH@v;j$eomMk{OS3cOX$iK5tH-v0g;4mEoWF=xsWBIW zsEWacORr`%U41A2)i#i!TA4#g3_~NGt#nJU%#uc4^u5_0NOn$;MaLThL;l#@ zd3gV}Ip=te@of^5h3l|7`U7OzxcF~WT+*@zGe&x9W!?~kAbMYI&+0G2Y7XAL$w4T8 zN}7egw`1PD$Q^LW+$ygU7ClFlVUb= zds_^B_2GX4c(_vayOWIg2llmEZ3)~T^qUFojSNi-BKK$MuMwYkwU;UsvE4G6#u=`4 z8Uk!p{rG!N+Gm*0ZR(D>mJot0!*afV67KvpE0CYK_&@ZcX!~yUpT6$YCx<Z;j8fGPeU>UrZXbwHJP;N#j{`ef+RH()#=P|Iv`ZX8u?Yh+lDRx-~y zmgL8c$qOW(?QXZ!D)-G7tSok`EG>62qVutoVC*MQO|SmI0s3PnnbMuHsB{W{NZI?H z_X*IzvCo&2j}I1RUVqFAEL9*qMJM9JyltQdQKp~q);6!&Qw~r{#q!%! zoiK`V#UXxbQtvykc_UCC%ay^z)J)HSNE|Q$1&{6GUxwSG)n4|b48?77T6X{n#Q$Vb zW^@M2LYzoE{^z*==|xshSY#A`q2W&tGaveo)2EZ6_A4270z=*uIFH$xXGoX7qBW?< zgC#WNiwfKc=R4?RhY$CSITa~HM4ydKqphTo`-Wo<8^wHuG4tFb=GIBh5wCMCF;F?0 zBCTwL3S5>>|$n*aPo(n?TE0Rle*KL7#%4gjWuC096p0`^q}9{>Q_{gWda LP6nMH00000l}Ed+ delta 6673 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 delta 6900 zcmV@KL7#%4ges(4^`!zK%bx*006(s0FfD3e=;Aj+Jwj4=zZs9 z#Q1EOe;UGIJ<;{TF>VL7uvBzSm9Dw?WY*}Vi0td6p*3?h;AYX7%C#T?rz&WUE!)qD z^8$vC{1%XMhBIuO{!4%QQJoSvlnW{R7ueiuZKocgO~P_I+d}B&P44` z*D=#TE++nOhKK9;e??Xef<@BL#Af3Kq5uSe=ViO3Xp>P3ewYO!LepOErKYkd>7?1I zl=bJOc5wFEtpA(Lc#^Sf)NUSi173cQipiLSNM)|MM zZ)Lx(BtFw^f+l9HFi1^NOWGlh-)SDn_%J-A3j$JoV5#j^e?i>e!MD1~h=o@*2pq0f z@p??d=FM{U%BT7h4te6M@5W{SxPAdM`iWKPDn_O{oOj76Zo3ud`uR2;YVDCBo%3vB zmmHfa36s{R5dy`C5+GQXIXElq3|hT}&>cgEc>esZ#@(kYAWd3=+TVqR-c$mTeMmm4 zTw}Q8`O5>0f0a^3xsDt}rx+lAVaYc-+j&&4<5&0-X_sQ9YXxL8h2mKX{q%%(`^B`8 z9qBPQ6E#t;z-56Dq^0h1`HiPH&sSMO8>Z{B&$4Qad}SgG=tGMNIA?nx4zBpp3j-^%I}9wBIQw2qiBxp!O~`K-J*n);=&!B4adb6;~gFb zdl}@+s^4Z?r_KyLdg&H0Ou#0|J_yas=LZ6D`8Im$Uw_i1mXk(Gl&24(Ck5EZe%xf9 z*ag#>e?T&_!=l6?W4ugl(j9Mb>W&Vz_tfxl_#*J*WtBH`gn2)6Kfs8_p-MYYOSo$1 zw+g!jSLU6Cp*Tpw7jKz+71=Jvu?@#$q&Kk-x%iN~_JyUWfeEjwMDvyxd2ER8Uaf+l zht}8{n{T;&W~-h0>cEbm`w%W=Aa|7>_fu!jf3e_-I)x(}yn*<6;h{~v|1}wlO7@V= z!QWhIvxtUsV$V3;9zaW}254^y8>^t+rNbtottzNdkGOGtb~hl#GVr$i)q;y*h?=sY zPPT6%w(CjPHVW@}G47PUC4L3t2yn|W4n{P(u%g6d^k+hrYBT(>>$&S^%JaIb!Qn=*sgT3oNCWZ2dJY}^6F`?;bRTOEeX zwV1N@otXz0fYmE_P_(;2n1IgvjRRaYe*rJz*G;mTfhqCY(scq-WK8&tJ)23HhQR$* z{;NPx;Hxo%_pE=}3cB0Xd@}reS1;?-z2+^vPe9@p0^5#wK$&;JkiffQgXn@6bQ_9A z`=((WcV+fk#r%=rOEPM-)1|UeYb6Cy|3)ft+TcUj`;DtB^!J(-OHj6Ldgmi*e--%z zMLsbbP3xw|=et^~3Al``5c{`BV2czV|C2{K$1+&4?#{XO?KI2};#;^e@Fbkht5^Nl z=aI@ToK)Fg`;)9aq~m2B#-jif1HH9RIr^MAosfk~PtslE$z$>7R1a<| z*7)2=QNnfyw#sBIx3o`3T@vJ!U!JPcQs3(x!DsqNmb%0A+?KlYgMz|IP=D`l4Sf^a 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 diff --git a/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.9-compact.zip b/tests/e2e/solc_parsing/test_data/compile/custom_error-0.8.4.sol-0.8.9-compact.zip index 17e75201852bd073a1beed505d96dd2903106cfb..f407956184a49c87c554bf5c509821b5b6f22d15 100644 GIT binary patch delta 8391 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 delta 6904 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 diff --git a/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol b/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol index 4e1e388fb1..e638b8d41c 100644 --- a/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol +++ b/tests/e2e/solc_parsing/test_data/custom_error-0.8.4.sol @@ -8,13 +8,19 @@ struct St{ uint v; } +uint256 constant MAX = 5; + error ErrorSimple(); error ErrorWithArgs(uint, uint); error ErrorWithStruct(St s); +error ErrorWithConst(uint256[MAX]); contract VendingMachine is I { + uint256 constant CMAX = 10; + error CErrorWithConst(uint256[CMAX]); + function err0() public { revert ErrorSimple(); } @@ -32,6 +38,14 @@ contract VendingMachine is I { function err4() public { revert ErrorWithEnum(SomeEnum.ONE); } + function err5(uint256[MAX] calldata a) public { + revert ErrorWithConst(a); + } + function err6(uint256[CMAX] calldata a) public { + revert CErrorWithConst(a); + } + + } contract A{ diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.10-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.11-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.12-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.13-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.14-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.15-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.4-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.5-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.6-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.7-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.8-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" diff --git a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json index 9020c8d522..0707fa1498 100644 --- a/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json +++ b/tests/e2e/solc_parsing/test_data/expected/custom_error-0.8.4.sol-0.8.9-compact.json @@ -5,7 +5,9 @@ "err1()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: NEW VARIABLE 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err2()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n1->2;\n2[label=\"Node Type: EXPRESSION 2\n\"];\n}\n", "err3()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", - "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" + "err4()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err5(uint256[5])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n", + "err6(uint256[10])": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" }, "A": { "f()": "digraph{\n0[label=\"Node Type: ENTRY_POINT 0\n\"];\n0->1;\n1[label=\"Node Type: EXPRESSION 1\n\"];\n}\n" From f1f4e5b4a5539e29cf2a52771753b719ec328253 Mon Sep 17 00:00:00 2001 From: Feist Josselin Date: Tue, 12 Sep 2023 00:01:33 +0200 Subject: [PATCH 28/29] Add detailed assert info for echidna (#2105) Add assert span info to echidna printer --- slither/printers/guidance/echidna.py | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/slither/printers/guidance/echidna.py b/slither/printers/guidance/echidna.py index 25e0968cdb..73a9c5619d 100644 --- a/slither/printers/guidance/echidna.py +++ b/slither/printers/guidance/echidna.py @@ -126,15 +126,24 @@ def _extract_constant_functions(slither: SlitherCore) -> Dict[str, List[str]]: return ret -def _extract_assert(slither: SlitherCore) -> Dict[str, List[str]]: - ret: Dict[str, List[str]] = {} +def _extract_assert(slither: SlitherCore) -> Dict[str, Dict[str, List[Dict]]]: + """ + Return the list of contract -> function name -> List(source mapping of the assert)) + + Args: + slither: + + Returns: + + """ + ret: Dict[str, Dict[str, List[Dict]]] = {} for contract in slither.contracts: - functions_using_assert = [] + functions_using_assert: Dict[str, List[Dict]] = defaultdict(list) for f in contract.functions_entry_points: - for v in f.all_solidity_calls(): - if v == SolidityFunction("assert(bool)"): - functions_using_assert.append(_get_name(f)) - break + for node in f.all_nodes(): + if SolidityFunction("assert(bool)") in node.solidity_calls and node.source_mapping: + func_name = _get_name(f) + functions_using_assert[func_name].append(node.source_mapping.to_json()) if functions_using_assert: ret[contract.name] = functions_using_assert return ret From cc9e65fe13f7219cb5e24799287194c0da85b7e4 Mon Sep 17 00:00:00 2001 From: Kevin Clancy Date: Tue, 12 Sep 2023 06:44:48 -0700 Subject: [PATCH 29/29] fix: reorder named arguments to match declaration order (#1949) Store names list in call operations and expressions. Reorder named arguments to match declaration order. A function call with explicitly named parameters, of the form f({argName1: arg1, ...}), may list the parameters in an order different from that of the function's declaration. In this case, the IR should reorder the arguments to match the function declaration order before generating IR. This PR implements named argument reordering for the following forms of function calls: - struct constructors (most important) - static internal calls For the following forms of function calls, the order of the declaration arguments is not directly available during IR generation, so the PR did not implement reordering for them: - external calls (HighLevelCall) - library calls - event calls The get_declared_param_names function returns None for these unimplemented call forms. --- slither/core/expressions/call_expression.py | 37 +++++++- slither/slithir/convert.py | 91 ++++++++++++++++++- slither/slithir/operations/call.py | 18 +++- slither/slithir/operations/high_level_call.py | 9 +- slither/slithir/operations/internal_call.py | 10 +- slither/slithir/operations/new_contract.py | 13 ++- slither/slithir/operations/new_structure.py | 11 ++- slither/slithir/tmp_operations/tmp_call.py | 19 +++- slither/slithir/utils/ssa.py | 15 ++- .../expressions/expression_parsing.py | 3 +- .../visitors/slithir/expression_to_slithir.py | 8 +- tests/unit/slithir/test_argument_reorder.py | 65 +++++++++++++ .../test_internal_call_reorder.sol | 8 ++ .../test_struct_constructor.sol | 11 +++ 14 files changed, 298 insertions(+), 20 deletions(-) create mode 100644 tests/unit/slithir/test_argument_reorder.py create mode 100644 tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol create mode 100644 tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol diff --git a/slither/core/expressions/call_expression.py b/slither/core/expressions/call_expression.py index 6708dda7e2..ec2b2cfceb 100644 --- a/slither/core/expressions/call_expression.py +++ b/slither/core/expressions/call_expression.py @@ -4,12 +4,32 @@ class CallExpression(Expression): # pylint: disable=too-many-instance-attributes - def __init__(self, called: Expression, arguments: List[Any], type_call: str) -> None: + def __init__( + self, + called: Expression, + arguments: List[Any], + type_call: str, + names: Optional[List[str]] = None, + ) -> None: + """ + #### Parameters + called - + The expression denoting the function to be called + arguments - + List of argument expressions + type_call - + A string formatting of the called function's return type + names - + For calls with named fields, list fields in call order. + For calls without named fields, None. + """ assert isinstance(called, Expression) + assert (names is None) or isinstance(names, list) super().__init__() self._called: Expression = called self._arguments: List[Expression] = arguments self._type_call: str = type_call + self._names: Optional[List[str]] = names # gas and value are only available if the syntax is {gas: , value: } # For the .gas().value(), the member are considered as function call # And converted later to the correct info (convert.py) @@ -17,6 +37,14 @@ def __init__(self, called: Expression, arguments: List[Any], type_call: str) -> self._value: Optional[Expression] = None self._salt: Optional[Expression] = None + @property + def names(self) -> Optional[List[str]]: + """ + For calls with named fields, list fields in call order. + For calls without named fields, None. + """ + return self._names + @property def call_value(self) -> Optional[Expression]: return self._value @@ -62,4 +90,9 @@ def __str__(self) -> str: if gas or value or salt: options = [gas, value, salt] txt += "{" + ",".join([o for o in options if o != ""]) + "}" - return txt + "(" + ",".join([str(a) for a in self._arguments]) + ")" + args = ( + "{" + ",".join([f"{n}:{str(a)}" for (a, n) in zip(self._arguments, self._names)]) + "}" + if self._names is not None + else ",".join([str(a) for a in self._arguments]) + ) + return txt + "(" + args + ")" diff --git a/slither/slithir/convert.py b/slither/slithir/convert.py index 75900f176f..4cb508fae6 100644 --- a/slither/slithir/convert.py +++ b/slither/slithir/convert.py @@ -385,6 +385,70 @@ def integrate_value_gas(result: List[Operation]) -> List[Operation]: ################################################################################### +def get_declared_param_names( + ins: Union[ + NewStructure, + NewContract, + InternalCall, + LibraryCall, + HighLevelCall, + InternalDynamicCall, + EventCall, + ] +) -> Optional[List[str]]: + """ + Given a call operation, return the list of parameter names, in the order + listed in the function declaration. + #### Parameters + ins - + The call instruction + #### Possible Returns + List[str] - + A list of the parameters in declaration order + None - + Workaround: Unable to obtain list of parameters in declaration order + """ + if isinstance(ins, NewStructure): + return [x.name for x in ins.structure.elems_ordered if not isinstance(x.type, MappingType)] + if isinstance(ins, (InternalCall, LibraryCall, HighLevelCall)): + if isinstance(ins.function, Function): + return [p.name for p in ins.function.parameters] + return None + if isinstance(ins, InternalDynamicCall): + return [p.name for p in ins.function_type.params] + + assert isinstance(ins, (EventCall, NewContract)) + return None + + +def reorder_arguments( + args: List[Variable], call_names: List[str], decl_names: List[str] +) -> List[Variable]: + """ + Reorder named struct constructor arguments so that they match struct declaration ordering rather + than call ordering + E.g. for `struct S { int x; int y; }` we reorder `S({y : 2, x : 3})` to `S(3, 2)` + #### Parameters + args - + Arguments to constructor call, in call order + names - + Parameter names in call order + decl_names - + Parameter names in declaration order + #### Returns + Reordered arguments to constructor call, now in declaration order + """ + assert len(args) == len(call_names) + assert len(call_names) == len(decl_names) + + args_ret = [] + for n in decl_names: + ind = call_names.index(n) + args_ret.append(args[ind]) + + return args_ret + + def propagate_type_and_convert_call(result: List[Operation], node: "Node") -> List[Operation]: """ Propagate the types variables and convert tmp call to real call operation @@ -434,6 +498,23 @@ def propagate_type_and_convert_call(result: List[Operation], node: "Node") -> Li if ins.call_id in calls_gas and isinstance(ins, (HighLevelCall, InternalDynamicCall)): ins.call_gas = calls_gas[ins.call_id] + if isinstance(ins, Call) and (ins.names is not None): + assert isinstance( + ins, + ( + NewStructure, + NewContract, + InternalCall, + LibraryCall, + HighLevelCall, + InternalDynamicCall, + EventCall, + ), + ) + decl_param_names = get_declared_param_names(ins) + if decl_param_names is not None: + call_data = reorder_arguments(call_data, ins.names, decl_param_names) + if isinstance(ins, (Call, NewContract, NewStructure)): # We might have stored some arguments for libraries if ins.arguments: @@ -855,7 +936,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, if isinstance(ins.ori.variable_left, Contract): st = ins.ori.variable_left.get_structure_from_name(ins.ori.variable_right) if st: - op = NewStructure(st, ins.lvalue) + op = NewStructure(st, ins.lvalue, names=ins.names) op.set_expression(ins.expression) op.call_id = ins.call_id return op @@ -892,6 +973,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, ins.nbr_arguments, ins.lvalue, ins.type_call, + names=ins.names, ) libcall.set_expression(ins.expression) libcall.call_id = ins.call_id @@ -950,6 +1032,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, len(lib_func.parameters), ins.lvalue, "d", + names=ins.names, ) lib_call.set_expression(ins.expression) lib_call.set_node(ins.node) @@ -1031,6 +1114,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, ins.nbr_arguments, ins.lvalue, ins.type_call, + names=ins.names, ) msgcall.call_id = ins.call_id @@ -1082,7 +1166,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, return n if isinstance(ins.called, Structure): - op = NewStructure(ins.called, ins.lvalue) + op = NewStructure(ins.called, ins.lvalue, names=ins.names) op.set_expression(ins.expression) op.call_id = ins.call_id op.set_expression(ins.expression) @@ -1106,7 +1190,7 @@ def extract_tmp_call(ins: TmpCall, contract: Optional[Contract]) -> Union[Call, if len(ins.called.constructor.parameters) != ins.nbr_arguments: return Nop() internalcall = InternalCall( - ins.called.constructor, ins.nbr_arguments, ins.lvalue, ins.type_call + ins.called.constructor, ins.nbr_arguments, ins.lvalue, ins.type_call, ins.names ) internalcall.call_id = ins.call_id internalcall.set_expression(ins.expression) @@ -1440,6 +1524,7 @@ def look_for_library_or_top_level( ir.nbr_arguments, ir.lvalue, ir.type_call, + names=ir.names, ) lib_call.set_expression(ir.expression) lib_call.set_node(ir.node) diff --git a/slither/slithir/operations/call.py b/slither/slithir/operations/call.py index 816c56e1d9..a4f9f6d722 100644 --- a/slither/slithir/operations/call.py +++ b/slither/slithir/operations/call.py @@ -6,9 +6,25 @@ class Call(Operation): - def __init__(self) -> None: + def __init__(self, names: Optional[List[str]] = None) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + assert (names is None) or isinstance(names, list) super().__init__() self._arguments: List[Variable] = [] + self._names = names + + @property + def names(self) -> Optional[List[str]]: + """ + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + return self._names @property def arguments(self) -> List[Variable]: diff --git a/slither/slithir/operations/high_level_call.py b/slither/slithir/operations/high_level_call.py index 5d654fc800..c60443f199 100644 --- a/slither/slithir/operations/high_level_call.py +++ b/slither/slithir/operations/high_level_call.py @@ -28,11 +28,18 @@ def __init__( nbr_arguments: int, result: Optional[Union[TemporaryVariable, TupleVariable, TemporaryVariableSSA]], type_call: str, + names: Optional[List[str]] = None, ) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance(function_name, Constant) assert is_valid_lvalue(result) or result is None self._check_destination(destination) - super().__init__() + super().__init__(names=names) # Contract is only possible for library call, which inherits from highlevelcall self._destination: Union[Variable, SolidityVariable, Contract] = destination # type: ignore self._function_name = function_name diff --git a/slither/slithir/operations/internal_call.py b/slither/slithir/operations/internal_call.py index 1983b885fe..06e75136e6 100644 --- a/slither/slithir/operations/internal_call.py +++ b/slither/slithir/operations/internal_call.py @@ -20,8 +20,16 @@ def __init__( Union[TupleVariableSSA, TemporaryVariableSSA, TupleVariable, TemporaryVariable] ], type_call: str, + names: Optional[List[str]] = None, ) -> None: - super().__init__() + # pylint: disable=too-many-arguments + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + super().__init__(names=names) self._contract_name = "" if isinstance(function, Function): self._function: Optional[Function] = function diff --git a/slither/slithir/operations/new_contract.py b/slither/slithir/operations/new_contract.py index 518a097cb5..9ed00b1ac0 100644 --- a/slither/slithir/operations/new_contract.py +++ b/slither/slithir/operations/new_contract.py @@ -12,11 +12,20 @@ class NewContract(Call, OperationWithLValue): # pylint: disable=too-many-instance-attributes def __init__( - self, contract_name: Constant, lvalue: Union[TemporaryVariableSSA, TemporaryVariable] + self, + contract_name: Constant, + lvalue: Union[TemporaryVariableSSA, TemporaryVariable], + names: Optional[List[str]] = None, ) -> None: + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance(contract_name, Constant) assert is_valid_lvalue(lvalue) - super().__init__() + super().__init__(names=names) self._contract_name = contract_name # todo create analyze to add the contract instance self._lvalue = lvalue diff --git a/slither/slithir/operations/new_structure.py b/slither/slithir/operations/new_structure.py index c50cd6a3e0..2aaba28ff7 100644 --- a/slither/slithir/operations/new_structure.py +++ b/slither/slithir/operations/new_structure.py @@ -1,4 +1,4 @@ -from typing import List, Union +from typing import List, Optional, Union from slither.slithir.operations.call import Call from slither.slithir.operations.lvalue import OperationWithLValue @@ -17,8 +17,15 @@ def __init__( self, structure: StructureContract, lvalue: Union[TemporaryVariableSSA, TemporaryVariable], + names: Optional[List[str]] = None, ) -> None: - super().__init__() + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + super().__init__(names=names) assert isinstance(structure, Structure) assert is_valid_lvalue(lvalue) self._structure = structure diff --git a/slither/slithir/tmp_operations/tmp_call.py b/slither/slithir/tmp_operations/tmp_call.py index 2137ebd819..a7bd614c74 100644 --- a/slither/slithir/tmp_operations/tmp_call.py +++ b/slither/slithir/tmp_operations/tmp_call.py @@ -1,4 +1,4 @@ -from typing import Optional, Union +from typing import List, Optional, Union from slither.core.declarations import ( Event, @@ -25,7 +25,15 @@ def __init__( nbr_arguments: int, result: Union[TupleVariable, TemporaryVariable], type_call: str, + names: Optional[List[str]] = None, ) -> None: + # pylint: disable=too-many-arguments + """ + #### Parameters + names - + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ assert isinstance( called, ( @@ -42,6 +50,7 @@ def __init__( self._called = called self._nbr_arguments = nbr_arguments self._type_call = type_call + self._names = names self._lvalue = result self._ori = None # self._callid = None @@ -49,6 +58,14 @@ def __init__( self._value = None self._salt = None + @property + def names(self) -> Optional[List[str]]: + """ + For calls of the form f({argName1 : arg1, ...}), the names of parameters listed in call order. + Otherwise, None. + """ + return self._names + @property def call_value(self): return self._value diff --git a/slither/slithir/utils/ssa.py b/slither/slithir/utils/ssa.py index 4c958798b4..ef908820eb 100644 --- a/slither/slithir/utils/ssa.py +++ b/slither/slithir/utils/ssa.py @@ -735,12 +735,17 @@ def copy_ir(ir: Operation, *instances) -> Operation: destination = get_variable(ir, lambda x: x.destination, *instances) function_name = ir.function_name nbr_arguments = ir.nbr_arguments + names = ir.names lvalue = get_variable(ir, lambda x: x.lvalue, *instances) type_call = ir.type_call if isinstance(ir, LibraryCall): - new_ir = LibraryCall(destination, function_name, nbr_arguments, lvalue, type_call) + new_ir = LibraryCall( + destination, function_name, nbr_arguments, lvalue, type_call, names=names + ) else: - new_ir = HighLevelCall(destination, function_name, nbr_arguments, lvalue, type_call) + new_ir = HighLevelCall( + destination, function_name, nbr_arguments, lvalue, type_call, names=names + ) new_ir.call_id = ir.call_id new_ir.call_value = get_variable(ir, lambda x: x.call_value, *instances) new_ir.call_gas = get_variable(ir, lambda x: x.call_gas, *instances) @@ -761,7 +766,8 @@ def copy_ir(ir: Operation, *instances) -> Operation: nbr_arguments = ir.nbr_arguments lvalue = get_variable(ir, lambda x: x.lvalue, *instances) type_call = ir.type_call - new_ir = InternalCall(function, nbr_arguments, lvalue, type_call) + names = ir.names + new_ir = InternalCall(function, nbr_arguments, lvalue, type_call, names=names) new_ir.arguments = get_arguments(ir, *instances) return new_ir if isinstance(ir, InternalDynamicCall): @@ -811,7 +817,8 @@ def copy_ir(ir: Operation, *instances) -> Operation: if isinstance(ir, NewStructure): structure = ir.structure lvalue = get_variable(ir, lambda x: x.lvalue, *instances) - new_ir = NewStructure(structure, lvalue) + names = ir.names + new_ir = NewStructure(structure, lvalue, names=names) new_ir.arguments = get_arguments(ir, *instances) return new_ir if isinstance(ir, Nop): diff --git a/slither/solc_parsing/expressions/expression_parsing.py b/slither/solc_parsing/expressions/expression_parsing.py index a0bce044c2..74ff593c70 100644 --- a/slither/solc_parsing/expressions/expression_parsing.py +++ b/slither/solc_parsing/expressions/expression_parsing.py @@ -179,7 +179,8 @@ def parse_call( sp = SuperCallExpression(called, arguments, type_return) sp.set_offset(expression["src"], caller_context.compilation_unit) return sp - call_expression = CallExpression(called, arguments, type_return) + names = expression["names"] if "names" in expression and len(expression["names"]) > 0 else None + call_expression = CallExpression(called, arguments, type_return, names=names) call_expression.set_offset(src, caller_context.compilation_unit) # Only available if the syntax {gas:, value:} was used diff --git a/slither/visitors/slithir/expression_to_slithir.py b/slither/visitors/slithir/expression_to_slithir.py index 9aca7f10cc..534b157c34 100644 --- a/slither/visitors/slithir/expression_to_slithir.py +++ b/slither/visitors/slithir/expression_to_slithir.py @@ -312,7 +312,9 @@ def _post_call_expression(self, expression: CallExpression) -> None: val = TupleVariable(self._node) else: val = TemporaryVariable(self._node) - internal_call = InternalCall(called, len(args), val, expression.type_call) + internal_call = InternalCall( + called, len(args), val, expression.type_call, names=expression.names + ) internal_call.set_expression(expression) self._result.append(internal_call) set_val(expression, val) @@ -381,7 +383,9 @@ def _post_call_expression(self, expression: CallExpression) -> None: else: val = TemporaryVariable(self._node) - message_call = TmpCall(called, len(args), val, expression.type_call) + message_call = TmpCall( + called, len(args), val, expression.type_call, names=expression.names + ) message_call.set_expression(expression) # Gas/value are only accessible here if the syntax {gas: , value: } # Is used over .gas().value() diff --git a/tests/unit/slithir/test_argument_reorder.py b/tests/unit/slithir/test_argument_reorder.py new file mode 100644 index 0000000000..12f5bd7f28 --- /dev/null +++ b/tests/unit/slithir/test_argument_reorder.py @@ -0,0 +1,65 @@ +from pathlib import Path + +from slither import Slither +from slither.slithir.operations.internal_call import InternalCall +from slither.slithir.operations.new_structure import NewStructure +from slither.slithir.variables.constant import Constant + +TEST_DATA_DIR = Path(__file__).resolve().parent / "test_data" +ARG_REORDER_TEST_ROOT = Path(TEST_DATA_DIR, "argument_reorder") + + +def test_struct_constructor_reorder(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.15") + slither = Slither( + Path(ARG_REORDER_TEST_ROOT, "test_struct_constructor.sol").as_posix(), solc=solc_path + ) + + operations = slither.contracts[0].functions[0].slithir_operations + constructor_calls = [x for x in operations if isinstance(x, NewStructure)] + assert len(constructor_calls) == 2 + + # Arguments to first call are 2, 3 + assert ( + isinstance(constructor_calls[0].arguments[0], Constant) + and constructor_calls[0].arguments[0].value == 2 + ) + assert ( + isinstance(constructor_calls[0].arguments[1], Constant) + and constructor_calls[0].arguments[1].value == 3 + ) + + # Arguments to second call are 5, 4 (note the reversed order) + assert ( + isinstance(constructor_calls[1].arguments[0], Constant) + and constructor_calls[1].arguments[0].value == 5 + ) + assert ( + isinstance(constructor_calls[1].arguments[1], Constant) + and constructor_calls[1].arguments[1].value == 4 + ) + + +def test_internal_call_reorder(solc_binary_path) -> None: + solc_path = solc_binary_path("0.8.15") + slither = Slither( + Path(ARG_REORDER_TEST_ROOT, "test_internal_call_reorder.sol").as_posix(), solc=solc_path + ) + + operations = slither.contracts[0].functions[1].slithir_operations + internal_calls = [x for x in operations if isinstance(x, InternalCall)] + assert len(internal_calls) == 1 + + # Arguments to call are 3, true, 5 + assert ( + isinstance(internal_calls[0].arguments[0], Constant) + and internal_calls[0].arguments[0].value == 3 + ) + assert ( + isinstance(internal_calls[0].arguments[1], Constant) + and internal_calls[0].arguments[1].value is True + ) + assert ( + isinstance(internal_calls[0].arguments[2], Constant) + and internal_calls[0].arguments[2].value == 5 + ) diff --git a/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol b/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol new file mode 100644 index 0000000000..4c4f658da8 --- /dev/null +++ b/tests/unit/slithir/test_data/argument_reorder/test_internal_call_reorder.sol @@ -0,0 +1,8 @@ +contract InternalCallReorderTest { + function internal_func(uint256 a, bool b, uint256 c) internal { + } + + function caller() external { + internal_func({a: 3, c: 5, b: true}); + } +} diff --git a/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol b/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol new file mode 100644 index 0000000000..05dbb50b0f --- /dev/null +++ b/tests/unit/slithir/test_data/argument_reorder/test_struct_constructor.sol @@ -0,0 +1,11 @@ +contract StructConstructorTest { + struct S { + int x; + int y; + } + + function test() external { + S memory p = S({x: 2, y: 3}); + S memory q = S({y: 4, x: 5}); + } +}