mirror of https://github.com/ConsenSys/mythril
Remove native tests (#1305)
parent
c965339959
commit
d4e97fe7d1
@ -1,93 +0,0 @@ |
||||
from mythril.solidity.soliditycontract import SolidityContract |
||||
from mythril.laser.ethereum.state.account import Account |
||||
from mythril.laser.ethereum.state.machine_state import MachineState |
||||
from mythril.laser.ethereum.state.global_state import GlobalState |
||||
from mythril.laser.ethereum.state.world_state import WorldState |
||||
from mythril.laser.ethereum import svm |
||||
from tests import BaseTestCase |
||||
|
||||
SHA256_TEST = [(0, False) for _ in range(4)] |
||||
RIPEMD160_TEST = [(0, False) for _ in range(2)] |
||||
ECRECOVER_TEST = [(0, False) for _ in range(2)] |
||||
IDENTITY_TEST = [(0, False) for _ in range(2)] |
||||
|
||||
# These are Random numbers to check whether the 'if condition' is entered or not |
||||
# (True means entered) |
||||
SHA256_TEST[0] = (hex(5555555555555555), True) |
||||
SHA256_TEST[1] = (hex(323232325445454546), False) |
||||
SHA256_TEST[2] = (hex(34756834765834658), True) |
||||
SHA256_TEST[3] = (hex(8756476956956795876987), False) |
||||
|
||||
RIPEMD160_TEST[0] = (hex(999999999999999999993), True) |
||||
RIPEMD160_TEST[1] = (hex(1111111111112), False) |
||||
|
||||
ECRECOVER_TEST[0] = (hex(674837568743979857398564869), True) |
||||
ECRECOVER_TEST[1] = (hex(3487683476979311), False) |
||||
|
||||
IDENTITY_TEST[0] = (hex(87426857369875698), True) |
||||
IDENTITY_TEST[1] = (hex(476934798798347), False) |
||||
|
||||
|
||||
def _all_info(laser): |
||||
nodes = {} |
||||
for uid, node in laser.nodes.items(): |
||||
states = [] |
||||
for state in node.states: |
||||
if isinstance(state, MachineState): |
||||
states.append(state.as_dict) |
||||
elif isinstance(state, GlobalState): |
||||
environment = state.environment.as_dict |
||||
environment["active_account"] = environment["active_account"].address |
||||
states.append( |
||||
{ |
||||
"accounts": state.accounts.keys(), |
||||
"environment": environment, |
||||
"mstate": state.mstate.as_dict, |
||||
} |
||||
) |
||||
|
||||
nodes[uid] = { |
||||
"uid": node.uid, |
||||
"contract_name": node.contract_name, |
||||
"start_addr": node.start_addr, |
||||
"states": states, |
||||
"constraints": node.constraints, |
||||
"function_name": node.function_name, |
||||
"flags": str(node.flags), |
||||
} |
||||
|
||||
edges = [edge.as_dict for edge in laser.edges] |
||||
|
||||
return { |
||||
"nodes": nodes, |
||||
"edges": edges, |
||||
"total_states": laser.total_states, |
||||
"max_depth": laser.max_depth, |
||||
} |
||||
|
||||
|
||||
def _test_natives(laser_info, test_list, test_name): |
||||
for i, j in test_list: |
||||
assert (str(i) in laser_info or str(int(i, 16)) in laser_info) == j |
||||
|
||||
|
||||
class NativeTests(BaseTestCase): |
||||
@staticmethod |
||||
def runTest(): |
||||
"""""" |
||||
# The solidity version (0.5.3 at the moment) should be kept in sync with |
||||
# pragma in ./tests/native_tests.sol |
||||
disassembly = SolidityContract("./tests/native_tests.sol").disassembly |
||||
account = Account("0x0000000000000000000000000000000000000000", disassembly) |
||||
world_state = WorldState() |
||||
world_state.put_account(account) |
||||
laser = svm.LaserEVM(max_depth=100, transaction_count=1) |
||||
laser.sym_exec(world_state=world_state, target_address=account.address.value) |
||||
|
||||
laser_info = str(_all_info(laser)) |
||||
|
||||
_test_natives(laser_info, SHA256_TEST, "SHA256") |
||||
_test_natives(laser_info, RIPEMD160_TEST, "RIPEMD160") |
||||
# This test should be changed as we can't properly handle concrete hashes at the moment. |
||||
# _test_natives(laser_info, ECRECOVER_TEST, "ECRECOVER") |
||||
_test_natives(laser_info, IDENTITY_TEST, "IDENTITY") |
@ -1,112 +0,0 @@ |
||||
pragma solidity ^0.5.0; |
||||
|
||||
|
||||
contract Caller { |
||||
|
||||
//Just some useless variables |
||||
address public fixedAddress; |
||||
address public storedAddress; |
||||
|
||||
//useless (but good for testing as they contribute as decoys) |
||||
uint256 private statevar; |
||||
bytes32 private far; |
||||
|
||||
constructor (address addr) public { |
||||
fixedAddress = addr; |
||||
} |
||||
/* |
||||
// Commented out because this causes laser to enter an infinite loop... :/ |
||||
// It sets the free memory pointer to a symbolic value, and things break |
||||
|
||||
//some typical function as a decoy |
||||
function thisisfine() public { |
||||
(bool success, bytes memory mem) = fixedAddress.call(""); |
||||
} |
||||
*/ |
||||
|
||||
function sha256Test1() public returns (uint256) { |
||||
uint256 i; |
||||
if (sha256(abi.encodePacked("ab", "c")) == sha256("abc")) { |
||||
// True |
||||
i = 5555555555555555; |
||||
} else { |
||||
// False |
||||
i = 323232325445454546; |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
function sha256Test2() public returns (uint256) { |
||||
uint256 i; |
||||
if (sha256("abd") == sha256(abi.encodePacked("ab", "d"))) { |
||||
// True |
||||
i = 34756834765834658; |
||||
} else { |
||||
// False |
||||
i = 8756476956956795876987; |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
function ripemdTest() public returns (uint256) { |
||||
uint256 i; |
||||
bytes20 v1 = ripemd160(""); |
||||
bytes20 v2 = ripemd160("hhhhh"); |
||||
|
||||
if (v1 != v2) { |
||||
// True |
||||
i = 999999999999999999993; |
||||
} else { |
||||
// False |
||||
i = 1111111111112; |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
function ecrecoverTest() public returns (uint256) { |
||||
bytes32 foobar1 = 0x1c8aff950685c2ed4bc3174f3472287b56d9517b9c948127319a09a7a36deac8; |
||||
bytes32 foobar2 = 0x38d18acb67d25c8bb9942764b62f18e17054f66a817bd4295423adf9ed98873e; |
||||
uint8 v = 28; |
||||
bytes32 r = 0x9242685bf161793cc25603c231bc2f568eb630ea16aa137d2664ac8038825608; |
||||
bytes32 s = 0x4f8ae3bd7535248d0bd448298cc2e2071e56992d0774dc340c368ae950852ada; |
||||
uint256 i; |
||||
address addr1 = ecrecover(keccak256(abi.encodePacked(foobar1)), v, r, s); |
||||
address addr2 = ecrecover(keccak256(abi.encodePacked(foobar1, foobar2)), v, r, s); |
||||
if (addr1 != addr2) { |
||||
// True |
||||
i = 674837568743979857398564869; |
||||
} else { |
||||
// False |
||||
i = 3487683476979311; |
||||
} |
||||
return i; |
||||
} |
||||
|
||||
//identity is invoked here in compiler and not below |
||||
function needIdentityInvoke(uint sea) public returns (uint) { |
||||
return sea; |
||||
} |
||||
|
||||
function identityFunction(int input) public returns(int out) { |
||||
assembly { |
||||
let x := mload(0x40) |
||||
mstore(x, input) |
||||
|
||||
let success := call(500000000, 0x4, 100000, x, 0x20, x, 0x20) |
||||
out := mload(x) |
||||
mstore(0x40, x) |
||||
} |
||||
} |
||||
|
||||
function identityTest1() public returns (uint256) { |
||||
uint256 i; |
||||
if (identityFunction(100) == 100) { |
||||
// True |
||||
i = 87426857369875698; |
||||
} else { |
||||
// False |
||||
i = 476934798798347; |
||||
} |
||||
return i; |
||||
} |
||||
} |
Loading…
Reference in new issue