mirror of https://github.com/crytic/slither
parent
ba1d536f40
commit
80c96cff84
@ -0,0 +1,61 @@ |
|||||||
|
import pytest |
||||||
|
|
||||||
|
from slither.core.cfg.node import Node, NodeType |
||||||
|
from slither.core.declarations import ( |
||||||
|
Function, |
||||||
|
Contract, |
||||||
|
) |
||||||
|
from slither.slithir.operations import ( |
||||||
|
Return, |
||||||
|
) |
||||||
|
|
||||||
|
|
||||||
|
def test_named_return_with_explicit_return(slither_from_source) -> None: |
||||||
|
source = """ |
||||||
|
contract Contract { |
||||||
|
function foo(int x) public returns (int y) { |
||||||
|
if(x > 0) { |
||||||
|
return x; |
||||||
|
} else { |
||||||
|
y = x * -1; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
""" |
||||||
|
with slither_from_source(source) as slither: |
||||||
|
c: Contract = slither.get_contract_from_name("Contract")[0] |
||||||
|
f: Function = c.functions[0] |
||||||
|
node_if: Node = f.nodes[1] |
||||||
|
node_true = node_if.son_true |
||||||
|
node_false = node_if.son_false |
||||||
|
assert node_true == NodeType.RETURN |
||||||
|
assert isinstance(node_true.irs[0], Return) |
||||||
|
assert node_true.irs[0].values[0] == f.get_local_variable_from_name("x") |
||||||
|
assert len(node_true.sons) == 0 |
||||||
|
node_end_if = node_false.sons[0] |
||||||
|
assert node_end_if.type == NodeType.ENDIF |
||||||
|
assert node_end_if.sons[0].type == NodeType.RETURN |
||||||
|
node_ret = node_end_if.sons[0] |
||||||
|
assert isinstance(node_ret.irs[0], Return) |
||||||
|
assert node_ret.irs[0].values[0] == f.get_local_variable_from_name("y") |
||||||
|
|
||||||
|
|
||||||
|
def test_issue_1846_ternary_in_ternary(slither_from_source): |
||||||
|
source = """ |
||||||
|
contract Contract { |
||||||
|
function foo(uint x) public returns (uint y) { |
||||||
|
y = x > 0 ? x > 1 ? 2 : 3 : 4; |
||||||
|
} |
||||||
|
} |
||||||
|
""" |
||||||
|
with slither_from_source(source) as slither: |
||||||
|
c: Contract = slither.get_contract_from_name("Contract")[0] |
||||||
|
f = c.functions[0] |
||||||
|
node_end_if = f.nodes[5] |
||||||
|
assert node_end_if.type == NodeType.ENDIF |
||||||
|
assert len(node_end_if.sons) == 1 |
||||||
|
node_ret = node_end_if.sons[0] |
||||||
|
assert node_ret.type == NodeType.RETURN |
||||||
|
assert isinstance(node_ret.irs[0], Return) |
||||||
|
assert node_ret.irs[0].values[0] == f.get_local_variable_from_name("y") |
||||||
|
|
Loading…
Reference in new issue