crytic / crytic/slither

[Bug]: Assertion failure in 'variable.py' line 132

Open
#1,798 0 comments 0 reactions 0 assignees View on GitHub
bug
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

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.