[Bug]: Assertion failure in 'variable.py' line 132
- Dominant language
- Python
- Stars
- 6.4k
- Forks
- 1.1k
- PR merge metrics
- No merged PRs in 30d
Description
### Describe the issue:
When we run Slither on the following program:
```
contract A {
struct B {
bytes f;
}
function f(
bytes memory payload
) external {
(B memory B) = abi.decode(payload, (B));
}
}
```
We get the following assertion error:
```
...
func.generate_slithir_and_analyze()
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/declarations/function.py", line 1750, in generate_slithir_and_analyze
node.slithir_generation()
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/cfg/node.py", line 723, in slithir_generation
self._irs = convert_expression(expression, self)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 119, in convert_expression
result = apply_ir_heuristics(result, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 1874, in apply_ir_heuristics
irs = propagate_type_and_convert_call(irs, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 442, in propagate_type_and_convert_call
new_ins = propagate_types(ins, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 538, in propagate_types
return convert_to_solidity_func(ir)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 1227, in convert_to_solidity_func
new_ir.lvalue.set_type(decode_type)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/variables/variable.py", line 132, in set_type
assert isinstance(t, (Type, list)) or t is None
```
Looks like the binding of the variable `B` is overriding the binding of the type `B` in the call to `abi.decode`.
### Code example to reproduce the issue:
```
contract A {
struct B {
bytes f;
}
function f(
bytes memory payload
) external {
(B memory B) = abi.decode(payload, (B));
}
}
```
### Version:
0.9.2
### Relevant log output:
```shell
func.generate_slithir_and_analyze()
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/declarations/function.py", line 1750, in generate_slithir_and_analyze
node.slithir_generation()
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/cfg/node.py", line 723, in slithir_generation
self._irs = convert_expression(expression, self)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 119, in convert_expression
result = apply_ir_heuristics(result, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 1874, in apply_ir_heuristics
irs = propagate_type_and_convert_call(irs, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 442, in propagate_type_and_convert_call
new_ins = propagate_types(ins, node)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 538, in propagate_types
return convert_to_solidity_func(ir)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/slithir/convert.py", line 1227, in convert_to_solidity_func
new_ir.lvalue.set_type(decode_type)
File "/Users/kevin.clancy/Code/slither-task-debug/utilities/slither/slither/core/variables/variable.py", line 132, in set_type
assert isinstance(t, (Type, list)) or t is None
```
Contributor guide
Assessment
This issue has not been assessed yet.