Add Ubuntu PPA support to solc installer, fix version to 0.5.0

pull/754/head
Dominik Muhs 6 years ago
parent a047f564b3
commit c4127fd229
  1. 20
      mythril/ethereum/util.py
  2. 53
      mythril/mythril.py
  3. 8
      tests/cmd_line_test.py
  4. 4
      tests/laser/transaction/create_transaction_test.py
  5. 2
      tests/native_test.py
  6. 6
      tests/solidity_contract_test.py
  7. 2
      tests/svm_test.py

@ -73,12 +73,14 @@ def get_indexed_address(index):
def solc_exists(version): def solc_exists(version):
solc_binary = os.path.join( solc_binaries = [
os.environ.get("HOME", str(Path.home())), os.path.join(
".py-solc/solc-v" + version, os.environ.get("HOME", str(Path.home())),
"bin/solc", ".py-solc/solc-v" + version,
) "bin/solc",
if os.path.exists(solc_binary): ), # py-solc setup
return True "/usr/bin/solc", # Ubuntu PPA setup
else: ]
return False for solc_path in solc_binaries:
if os.path.exists(solc_path):
return solc_path

@ -224,36 +224,33 @@ class Mythril(object):
# Figure out solc binary and version # Figure out solc binary and version
# Only proper versions are supported. No nightlies, commits etc (such as available in remix) # Only proper versions are supported. No nightlies, commits etc (such as available in remix)
if version: if not version:
# tried converting input to semver, seemed not necessary so just slicing for now return os.environ.get("SOLC") or "solc"
if version == str(solc.main.get_solc_version())[:6]:
logging.info("Given version matches installed version")
try:
solc_binary = os.environ["SOLC"]
except KeyError:
solc_binary = "solc"
else:
if util.solc_exists(version):
logging.info("Given version is already installed")
else:
try:
solc.install_solc("v" + version)
except SolcError:
raise CriticalError(
"There was an error when trying to install the specified solc version"
)
solc_binary = os.path.join( # tried converting input to semver, seemed not necessary so just slicing for now
os.environ.get("HOME", str(Path.home())), main_version = solc.main.get_solc_version_string()
".py-solc/solc-v" + version, main_version_number = re.match(r"\d+.\d+.\d+", main_version)
"bin/solc", if main_version is None:
) raise CriticalError(
logging.info("Setting the compiler to " + str(solc_binary)) "Could not extract solc version from string {}".format(main_version)
)
if version == main_version_number:
logging.info("Given version matches installed version")
solc_binary = os.environ.get("SOLC") or "solc"
else: else:
try: solc_binary = util.solc_exists(version)
solc_binary = os.environ["SOLC"] if solc_binary:
except KeyError: logging.info("Given version is already installed")
solc_binary = "solc" else:
try:
solc.install_solc("v" + version)
except SolcError:
raise CriticalError(
"There was an error when trying to install the specified solc version"
)
logging.info("Setting the compiler to %s", solc_binary)
return solc_binary return solc_binary
def set_api_leveldb(self, leveldb): def set_api_leveldb(self, leveldb):

@ -10,18 +10,16 @@ def output_of(command):
class CommandLineToolTestCase(BaseTestCase): class CommandLineToolTestCase(BaseTestCase):
def test_disassemble_code_correctly(self): def test_disassemble_code_correctly(self):
command = "python3 {} MYTH -d --bin-runtime -c 0x5050 --solv 0.4.24".format( command = "python3 {} MYTH -d --bin-runtime -c 0x5050 --solv 0.5.0".format(MYTH)
MYTH
)
self.assertIn("0 POP\n1 POP\n", output_of(command)) self.assertIn("0 POP\n1 POP\n", output_of(command))
def test_disassemble_solidity_file_correctly(self): def test_disassemble_solidity_file_correctly(self):
solidity_file = str(TESTDATA / "input_contracts" / "metacoin.sol") solidity_file = str(TESTDATA / "input_contracts" / "metacoin.sol")
command = "python3 {} -d {} --solv 0.4.24".format(MYTH, solidity_file) command = "python3 {} -d {} --solv 0.5.0".format(MYTH, solidity_file)
self.assertIn("2 PUSH1 0x40\n4 MSTORE", output_of(command)) self.assertIn("2 PUSH1 0x40\n4 MSTORE", output_of(command))
def test_hash_a_function_correctly(self): def test_hash_a_function_correctly(self):
command = "python3 {} --solv 0.4.24 --hash 'setOwner(address)'".format(MYTH) command = "python3 {} --solv 0.5.0 --hash 'setOwner(address)'".format(MYTH)
self.assertIn("0x13af4035\n", output_of(command)) self.assertIn("0x13af4035\n", output_of(command))

@ -13,7 +13,7 @@ from mythril.analysis.symbolic import SymExecWrapper
def test_create(): def test_create():
contract = SolidityContract( contract = SolidityContract(
str(tests.TESTDATA_INPUTS_CONTRACTS / "calls.sol"), str(tests.TESTDATA_INPUTS_CONTRACTS / "calls.sol"),
solc_binary=Mythril._init_solc_binary("0.4.24"), solc_binary=Mythril._init_solc_binary("0.5.0"),
) )
laser_evm = svm.LaserEVM({}) laser_evm = svm.LaserEVM({})
@ -37,7 +37,7 @@ def test_create():
def test_sym_exec(): def test_sym_exec():
contract = SolidityContract( contract = SolidityContract(
str(tests.TESTDATA_INPUTS_CONTRACTS / "calls.sol"), str(tests.TESTDATA_INPUTS_CONTRACTS / "calls.sol"),
solc_binary=Mythril._init_solc_binary("0.4.24"), solc_binary=Mythril._init_solc_binary("0.5.0"),
) )
sym = SymExecWrapper( sym = SymExecWrapper(

@ -89,7 +89,7 @@ class NativeTests(BaseTestCase):
def runTest(): def runTest():
disassembly = SolidityContract( disassembly = SolidityContract(
"./tests/native_tests.sol", solc_binary=Mythril._init_solc_binary("0.4.24") "./tests/native_tests.sol", solc_binary=Mythril._init_solc_binary("0.5.0")
).disassembly ).disassembly
account = Account("0x0000000000000000000000000000000000000000", disassembly) account = Account("0x0000000000000000000000000000000000000000", disassembly)
accounts = {account.address: account} accounts = {account.address: account}

@ -11,7 +11,7 @@ class SolidityContractTest(BaseTestCase):
def test_get_source_info_without_name_gets_latest_contract_info(self): def test_get_source_info_without_name_gets_latest_contract_info(self):
input_file = TEST_FILES / "multi_contracts.sol" input_file = TEST_FILES / "multi_contracts.sol"
contract = SolidityContract( contract = SolidityContract(
str(input_file), solc_binary=Mythril._init_solc_binary("0.4.24") str(input_file), solc_binary=Mythril._init_solc_binary("0.5.0")
) )
code_info = contract.get_source_info(142) code_info = contract.get_source_info(142)
@ -25,7 +25,7 @@ class SolidityContractTest(BaseTestCase):
contract = SolidityContract( contract = SolidityContract(
str(input_file), str(input_file),
name="Transfer1", name="Transfer1",
solc_binary=Mythril._init_solc_binary("0.4.24"), solc_binary=Mythril._init_solc_binary("0.5.0"),
) )
code_info = contract.get_source_info(142) code_info = contract.get_source_info(142)
@ -39,7 +39,7 @@ class SolidityContractTest(BaseTestCase):
contract = SolidityContract( contract = SolidityContract(
str(input_file), str(input_file),
name="AssertFail", name="AssertFail",
solc_binary=Mythril._init_solc_binary("0.4.24"), solc_binary=Mythril._init_solc_binary("0.5.0"),
) )
code_info = contract.get_source_info(70, constructor=True) code_info = contract.get_source_info(70, constructor=True)

@ -84,7 +84,7 @@ class SVMTestCase(BaseTestCase):
) )
disassembly = SolidityContract( disassembly = SolidityContract(
str(input_file), solc_binary=Mythril._init_solc_binary("0.4.24") str(input_file), solc_binary=Mythril._init_solc_binary("0.5.0")
).disassembly ).disassembly
account = Account("0x0000000000000000000000000000000000000000", disassembly) account = Account("0x0000000000000000000000000000000000000000", disassembly)
accounts = {account.address: account} accounts = {account.address: account}

Loading…
Cancel
Save