[Bug]: AssertionError in constant conversion during IR generation
- Dominant language
- Python
- Stars
- 6.4k
- Forks
- 1.1k
- PR merge metrics
- No merged PRs in 30d
Description
### Describe the issue:
Running the latest slither on a foundry solidity repo triggers an AssertionError in constant conversion during analysis (see log).
### Code example to reproduce the issue:
The repo I ran this on is https://github.com/lurk-lab/solidity-verifier
The line triggering the assertion issue is here:
https://github.com/lurk-lab/solidity-verifier/blob/0f38c9250a072db894378fa4005b67b9206d287d/test/sponge-tests.t.sol#L137
The function at play is:
https://github.com/lurk-lab/solidity-verifier/blob/0f38c9250a072db894378fa4005b67b9206d287d/src/poseidon/Sponge.sol#L153
Printing the list of types, followed by argument list, before the assertion, turns up:
```
uint256
uint256
p
0
TMP_20317
```
(which would seem to find an extra argument?!)
### Version:
```
huitseeker@lightning.localdomain➜~/tmp/solidity-verifier(slither✗)» slither --version
0.9.6
```
(latest pip release)
### Relevant log output:
```shell
huitseeker@lightning.localdomain➜~/tmp/solidity-verifier(slither✗)» slither . --exclude-dependencies [15:29:33]
'forge clean' running (wd: /Users/huitseeker/tmp/solidity-verifier)
'forge build --build-info' running (wd: /Users/huitseeker/tmp/solidity-verifier)
ERROR:SlitherSolcParsing:
Failed to generate IR for SpongeContractTest.testIOPattern. Please open an issue https://github.com/crytic/slither/issues.
SpongeContractTest.testIOPattern (test/sponge-tests.t.sol#132-173):
pattern = new SpongeOpLib.SpongeOp[](0)
p = IOPatternLib.IOPattern(pattern)
assertEq(0,IOPatternLib.value(p,0))
Traceback (most recent call last):
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 814, in main_impl
) = process_all(filename, args, detector_classes, printer_classes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 102, in process_all
) = process_single(compilation, args, detector_classes, printer_classes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 80, in process_single
slither = Slither(target, ast_format=ast, **vars(args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 135, in __init__
self._init_parsing_and_analyses(kwargs.get("skip_analyze", False))
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 155, in _init_parsing_and_analyses
raise e
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 151, in _init_parsing_and_analyses
parser.analyze_contracts()
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 541, in analyze_contracts
self._convert_to_slithir()
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 767, in _convert_to_slithir
raise e
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 752, in _convert_to_slithir
func.generate_slithir_and_analyze()
File "/opt/homebrew/lib/python3.11/site-packages/slither/core/declarations/function.py", line 1760, in generate_slithir_and_analyze
node.slithir_generation()
File "/opt/homebrew/lib/python3.11/site-packages/slither/core/cfg/node.py", line 706, in slithir_generation
self._irs = convert_expression(expression, self) # type:ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 118, in convert_expression
result = apply_ir_heuristics(result, node)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 1919, in apply_ir_heuristics
convert_constant_types(irs)
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 1838, in convert_constant_types
assert len(types) == len(ir.arguments)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
ERROR:root:Error in .
ERROR:root:Traceback (most recent call last):
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 814, in main_impl
) = process_all(filename, args, detector_classes, printer_classes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 102, in process_all
) = process_single(compilation, args, detector_classes, printer_classes)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/__main__.py", line 80, in process_single
slither = Slither(target, ast_format=ast, **vars(args))
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 135, in __init__
self._init_parsing_and_analyses(kwargs.get("skip_analyze", False))
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 155, in _init_parsing_and_analyses
raise e
File "/opt/homebrew/lib/python3.11/site-packages/slither/slither.py", line 151, in _init_parsing_and_analyses
parser.analyze_contracts()
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 541, in analyze_contracts
self._convert_to_slithir()
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 767, in _convert_to_slithir
raise e
File "/opt/homebrew/lib/python3.11/site-packages/slither/solc_parsing/slither_compilation_unit_solc.py", line 752, in _convert_to_slithir
func.generate_slithir_and_analyze()
File "/opt/homebrew/lib/python3.11/site-packages/slither/core/declarations/function.py", line 1760, in generate_slithir_and_analyze
node.slithir_generation()
File "/opt/homebrew/lib/python3.11/site-packages/slither/core/cfg/node.py", line 706, in slithir_generation
self._irs = convert_expression(expression, self) # type:ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 118, in convert_expression
result = apply_ir_heuristics(result, node)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 1919, in apply_ir_heuristics
convert_constant_types(irs)
File "/opt/homebrew/lib/python3.11/site-packages/slither/slithir/convert.py", line 1838, in convert_constant_types
assert len(types) == len(ir.arguments)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
AssertionError
```
Contributor guide
Assessment
This issue has not been assessed yet.