|
|
|
@ -10,7 +10,7 @@ from slither.slithir.operations import ( |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_named_return_with_explicit_return(slither_from_source) -> None: |
|
|
|
|
def test_with_explicit_return(slither_from_source) -> None: |
|
|
|
|
source = """ |
|
|
|
|
contract Contract { |
|
|
|
|
function foo(int x) public returns (int y) { |
|
|
|
@ -40,6 +40,72 @@ def test_named_return_with_explicit_return(slither_from_source) -> None: |
|
|
|
|
assert node_ret.irs[0].values[0] == f.get_local_variable_from_name("y") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_return_multiple_with_struct(slither_from_source) -> None: |
|
|
|
|
source = """ |
|
|
|
|
struct St { |
|
|
|
|
uint256 value; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
contract Contract { |
|
|
|
|
function foo(St memory x) public returns (St memory y, uint256 z) { |
|
|
|
|
z = x.value; |
|
|
|
|
y = St({value: z + 1}); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
""" |
|
|
|
|
with slither_from_source(source) as slither: |
|
|
|
|
c: Contract = slither.get_contract_from_name("Contract")[0] |
|
|
|
|
f: Function = c.functions[0] |
|
|
|
|
assert len(f.nodes) == 4 |
|
|
|
|
node = f.nodes[3] |
|
|
|
|
assert node.type == NodeType.RETURN |
|
|
|
|
assert isinstance(node_true.irs[0], Return) |
|
|
|
|
assert node_true.irs[0].values[0] == f.get_local_variable_from_name("y") |
|
|
|
|
assert node_true.irs[0].values[1] == f.get_local_variable_from_name("z") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_nested_ifs_with_loop(slither_from_source) -> None: |
|
|
|
|
source = """ |
|
|
|
|
contract Contract { |
|
|
|
|
function foo(uint a) public returns (uint x) { |
|
|
|
|
x = a; |
|
|
|
|
if(a == 1) { |
|
|
|
|
return a; |
|
|
|
|
} else { |
|
|
|
|
for (uint i = 0; i < 10; i++) { |
|
|
|
|
if (x > 10) { |
|
|
|
|
if (a < 0) { |
|
|
|
|
x = 10 * x; |
|
|
|
|
} else { |
|
|
|
|
throw; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
x++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
""" |
|
|
|
|
with slither_from_source(source) as slither: |
|
|
|
|
c: Contract = slither.get_contract_from_name("Contract")[0] |
|
|
|
|
f: Function = c.functions[0] |
|
|
|
|
node_if = f.nodes[2] |
|
|
|
|
assert node_if.son_true.type == NodeType.RETURN |
|
|
|
|
node_explicit = node_if.son_true |
|
|
|
|
assert isinstance(node_explicit.irs[0], Return) |
|
|
|
|
assert node_explicit.irs[0].values[0] == f.get_local_variable_from_name("a") |
|
|
|
|
node_end_if = f.nodes[16] |
|
|
|
|
assert node_end_if.type == NodeType.ENDIF |
|
|
|
|
assert node_end_if.sons[0].type == NodeType.RETURN |
|
|
|
|
node_implicit = node_end_if.sons[0] |
|
|
|
|
assert isinstance(node_implicit.irs[0], Return) |
|
|
|
|
assert node_implicit.irs[0].values[0] == f.get_local_variable_from_name("x") |
|
|
|
|
node_throw = f.nodes[11] |
|
|
|
|
assert node_throw.type == NodeType.THROW |
|
|
|
|
assert len(node_throw.sons) == 0 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def test_issue_1846_ternary_in_ternary(slither_from_source): |
|
|
|
|
source = """ |
|
|
|
|
contract Contract { |
|
|
|
|