Skip to content

Commit

Permalink
Run Black
Browse files Browse the repository at this point in the history
  • Loading branch information
montyly committed Aug 31, 2020
1 parent 88954ac commit 3f70606
Show file tree
Hide file tree
Showing 16 changed files with 286 additions and 194 deletions.
59 changes: 46 additions & 13 deletions examples/scripts/call_graph.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,38 +9,70 @@
logging.getLogger("Slither").setLevel(logging.INFO)
logging.getLogger("Printers").setLevel(logging.INFO)

class PrinterCallGraphStateChange(PrinterCallGraph):

def _process_function(self, contract, function, contract_functions, contract_calls, solidity_functions, solidity_calls, external_calls, all_contracts):
class PrinterCallGraphStateChange(PrinterCallGraph):
def _process_function(
self,
contract,
function,
contract_functions,
contract_calls,
solidity_functions,
solidity_calls,
external_calls,
all_contracts,
):
if function.view or function.pure:
return
super()._process_function(contract, function, contract_functions, contract_calls, solidity_functions, solidity_calls, external_calls, all_contracts)
super()._process_function(
contract,
function,
contract_functions,
contract_calls,
solidity_functions,
solidity_calls,
external_calls,
all_contracts,
)

def _process_internal_call(self, contract, function, internal_call, contract_calls, solidity_functions, solidity_calls):
def _process_internal_call(
self, contract, function, internal_call, contract_calls, solidity_functions, solidity_calls
):
if isinstance(internal_call, Function):
if internal_call.view or internal_call.pure:
return
super()._process_internal_call(contract, function, internal_call, contract_calls, solidity_functions, solidity_calls)
super()._process_internal_call(
contract, function, internal_call, contract_calls, solidity_functions, solidity_calls
)

def _process_external_call(self, contract, function, external_call, contract_functions, external_calls, all_contracts):
def _process_external_call(
self, contract, function, external_call, contract_functions, external_calls, all_contracts
):
if isinstance(external_call[1], Function):
if external_call[1].view or external_call[1].pure:
return
super()._process_external_call(contract, function, external_call, contract_functions, external_calls, all_contracts)
super()._process_external_call(
contract, function, external_call, contract_functions, external_calls, all_contracts
)


def parse_args():
"""
"""
parser = argparse.ArgumentParser(description='Call graph printer. Similar to --print call-graph, but without printing the view/pure functions',
usage='call_graph.py filename')
parser = argparse.ArgumentParser(
description="Call graph printer. Similar to --print call-graph, but without printing the view/pure functions",
usage="call_graph.py filename",
)

parser.add_argument('filename',
help='The filename of the contract or truffle directory to analyze.')
parser.add_argument(
"filename", help="The filename of the contract or truffle directory to analyze."
)

parser.add_argument('--solc', help='solc path', default='solc')
parser.add_argument("--solc", help="solc path", default="solc")

return parser.parse_args()


def main():

args = parse_args()
Expand All @@ -50,5 +82,6 @@ def main():

slither.run_printers()

if __name__ == '__main__':

if __name__ == "__main__":
main()
10 changes: 5 additions & 5 deletions examples/scripts/convert_to_evm_ins.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,14 @@
from slither.evm.convert import SourceToEVM

if len(sys.argv) != 2:
print('python3 function_called.py functions_called.sol')
print("python3 function_called.py functions_called.sol")
exit(-1)

# Init slither
slither = Slither(sys.argv[1])

# Get the contract evm instructions
contract = slither.get_contract_from_name('Test')
contract = slither.get_contract_from_name("Test")
contract_ins = SourceToEVM.get_evm_instructions(contract)
print("## Contract evm instructions: {} ##".format(contract.name))
for ins in contract_ins:
Expand All @@ -22,14 +22,14 @@
constructor_ins = SourceToEVM.get_evm_instructions(constructor)
for ins in constructor_ins:
print(str(ins))

# Get the function evm instructions
function = contract.get_function_from_signature('foo()')
function = contract.get_function_from_signature("foo()")
print("## Function evm instructions: {} ##".format(function.name))
function_ins = SourceToEVM.get_evm_instructions(function)
for ins in function_ins:
print(str(ins))

# Get the node evm instructions
nodes = function.nodes
for node in nodes:
Expand Down
14 changes: 6 additions & 8 deletions examples/scripts/convert_to_ir.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,27 +4,25 @@


if len(sys.argv) != 2:
print('python function_called.py functions_called.sol')
print("python function_called.py functions_called.sol")
exit(-1)

# Init slither
slither = Slither(sys.argv[1])

# Get the contract
contract = slither.get_contract_from_name('Test')
contract = slither.get_contract_from_name("Test")

# Get the variable
test = contract.get_function_from_signature('one()')
test = contract.get_function_from_signature("one()")

nodes = test.nodes

for node in nodes:
if node.expression:
print('Expression:\n\t{}'.format(node.expression))
print("Expression:\n\t{}".format(node.expression))
irs = convert_expression(node.expression)
print('IR expressions:')
print("IR expressions:")
for ir in irs:
print('\t{}'.format(ir))
print("\t{}".format(ir))
print()


146 changes: 95 additions & 51 deletions examples/scripts/data_dependency.py
Original file line number Diff line number Diff line change
@@ -1,95 +1,139 @@
import sys
from slither import Slither
from slither.analyses.data_dependency.data_dependency import is_dependent, is_tainted, pprint_dependency
from slither.analyses.data_dependency.data_dependency import (
is_dependent,
is_tainted,
pprint_dependency,
)
from slither.core.declarations.solidity_variables import SolidityVariableComposed

if len(sys.argv) != 2:
print('Usage: python data_dependency.py file.sol')
print("Usage: python data_dependency.py file.sol")
exit(-1)

slither = Slither(sys.argv[1])

contract = slither.get_contract_from_name('Simple')
contract = slither.get_contract_from_name("Simple")

destination = contract.get_state_variable_from_name('destination')
source = contract.get_state_variable_from_name('source')
destination = contract.get_state_variable_from_name("destination")
source = contract.get_state_variable_from_name("source")

print('{} is dependent of {}: {}'.format(source, destination, is_dependent(source, destination, contract)))
print(
"{} is dependent of {}: {}".format(
source, destination, is_dependent(source, destination, contract)
)
)
assert not is_dependent(source, destination, contract)
print('{} is dependent of {}: {}'.format(destination, source, is_dependent(destination, source, contract)))
print(
"{} is dependent of {}: {}".format(
destination, source, is_dependent(destination, source, contract)
)
)
assert is_dependent(destination, source, contract)
print('{} is tainted {}'.format(source, is_tainted(source, contract)))
print("{} is tainted {}".format(source, is_tainted(source, contract)))
assert not is_tainted(source, contract)
print('{} is tainted {}'.format(destination, is_tainted(destination, contract)))
print("{} is tainted {}".format(destination, is_tainted(destination, contract)))
assert is_tainted(destination, contract)

contract = slither.get_contract_from_name('Reference')
contract = slither.get_contract_from_name("Reference")

destination = contract.get_state_variable_from_name('destination')
source = contract.get_state_variable_from_name('source')
destination = contract.get_state_variable_from_name("destination")
source = contract.get_state_variable_from_name("source")

print('Reference contract')
print('{} is dependent of {}: {}'.format(source, destination, is_dependent(source, destination, contract)))
print("Reference contract")
print(
"{} is dependent of {}: {}".format(
source, destination, is_dependent(source, destination, contract)
)
)
assert not is_dependent(source, destination, contract)
print('{} is dependent of {}: {}'.format(destination, source, is_dependent(destination, source, contract)))
print(
"{} is dependent of {}: {}".format(
destination, source, is_dependent(destination, source, contract)
)
)
assert is_dependent(destination, source, contract)
print('{} is tainted {}'.format(source, is_tainted(source, contract)))
print("{} is tainted {}".format(source, is_tainted(source, contract)))
assert not is_tainted(source, contract)
print('{} is tainted {}'.format(destination, is_tainted(destination, contract)))
print("{} is tainted {}".format(destination, is_tainted(destination, contract)))
assert is_tainted(destination, contract)

destination_indirect_1 = contract.get_state_variable_from_name('destination_indirect_1')
print('{} is tainted {}'.format(destination_indirect_1, is_tainted(destination_indirect_1, contract)))
destination_indirect_1 = contract.get_state_variable_from_name("destination_indirect_1")
print(
"{} is tainted {}".format(destination_indirect_1, is_tainted(destination_indirect_1, contract))
)
assert is_tainted(destination_indirect_1, contract)
destination_indirect_2 = contract.get_state_variable_from_name('destination_indirect_2')
print('{} is tainted {}'.format(destination_indirect_2, is_tainted(destination_indirect_2, contract)))
destination_indirect_2 = contract.get_state_variable_from_name("destination_indirect_2")
print(
"{} is tainted {}".format(destination_indirect_2, is_tainted(destination_indirect_2, contract))
)
assert is_tainted(destination_indirect_2, contract)

print('SolidityVar contract')
print("SolidityVar contract")

contract = slither.get_contract_from_name('SolidityVar')
contract = slither.get_contract_from_name("SolidityVar")

addr_1 = contract.get_state_variable_from_name('addr_1')
addr_2 = contract.get_state_variable_from_name('addr_2')
msgsender = SolidityVariableComposed('msg.sender')
print('{} is dependent of {}: {}'.format(addr_1, msgsender, is_dependent(addr_1, msgsender, contract)))
addr_1 = contract.get_state_variable_from_name("addr_1")
addr_2 = contract.get_state_variable_from_name("addr_2")
msgsender = SolidityVariableComposed("msg.sender")
print(
"{} is dependent of {}: {}".format(addr_1, msgsender, is_dependent(addr_1, msgsender, contract))
)
assert is_dependent(addr_1, msgsender, contract)
print('{} is dependent of {}: {}'.format(addr_2, msgsender, is_dependent(addr_2, msgsender, contract)))
print(
"{} is dependent of {}: {}".format(addr_2, msgsender, is_dependent(addr_2, msgsender, contract))
)
assert not is_dependent(addr_2, msgsender, contract)


print('Intermediate contract')
contract = slither.get_contract_from_name('Intermediate')
destination = contract.get_state_variable_from_name('destination')
source = contract.get_state_variable_from_name('source')
print("Intermediate contract")
contract = slither.get_contract_from_name("Intermediate")
destination = contract.get_state_variable_from_name("destination")
source = contract.get_state_variable_from_name("source")

print('{} is dependent of {}: {}'.format(destination, source, is_dependent(destination, source, contract)))
print(
"{} is dependent of {}: {}".format(
destination, source, is_dependent(destination, source, contract)
)
)
assert is_dependent(destination, source, contract)

print('Base Derived contract')
contract = slither.get_contract_from_name('Base')
contract_derived = slither.get_contract_from_name('Derived')
destination = contract.get_state_variable_from_name('destination')
source = contract.get_state_variable_from_name('source')

print('{} is dependent of {}: {} (base)'.format(destination, source, is_dependent(destination, source, contract)))
print("Base Derived contract")
contract = slither.get_contract_from_name("Base")
contract_derived = slither.get_contract_from_name("Derived")
destination = contract.get_state_variable_from_name("destination")
source = contract.get_state_variable_from_name("source")

print(
"{} is dependent of {}: {} (base)".format(
destination, source, is_dependent(destination, source, contract)
)
)
assert not is_dependent(destination, source, contract)
print('{} is dependent of {}: {} (derived)'.format(destination, source, is_dependent(destination, source, contract_derived)))
print(
"{} is dependent of {}: {} (derived)".format(
destination, source, is_dependent(destination, source, contract_derived)
)
)
assert is_dependent(destination, source, contract_derived)

print('PropagateThroughArguments contract')
contract = slither.get_contract_from_name('PropagateThroughArguments')
var_tainted = contract.get_state_variable_from_name('var_tainted')
var_not_tainted = contract.get_state_variable_from_name('var_not_tainted')
var_dependant = contract.get_state_variable_from_name('var_dependant')
print("PropagateThroughArguments contract")
contract = slither.get_contract_from_name("PropagateThroughArguments")
var_tainted = contract.get_state_variable_from_name("var_tainted")
var_not_tainted = contract.get_state_variable_from_name("var_not_tainted")
var_dependant = contract.get_state_variable_from_name("var_dependant")

f = contract.get_function_from_signature('f(uint256)')
f = contract.get_function_from_signature("f(uint256)")
user_input = f.parameters[0]
f2 = contract.get_function_from_signature('f2(uint256,uint256)')
f2 = contract.get_function_from_signature("f2(uint256,uint256)")

print('{} is dependent of {}: {} (base)'.format(var_dependant, user_input, is_dependent(var_dependant, user_input, contract)))
print(
"{} is dependent of {}: {} (base)".format(
var_dependant, user_input, is_dependent(var_dependant, user_input, contract)
)
)
assert is_dependent(var_dependant, user_input, contract)
print('{} is tainted: {}'.format(var_tainted, is_tainted(var_tainted, contract)))
print("{} is tainted: {}".format(var_tainted, is_tainted(var_tainted, contract)))
assert is_tainted(var_tainted, contract)
print('{} is tainted: {}'.format(var_not_tainted, is_tainted(var_not_tainted, contract)))
print("{} is tainted: {}".format(var_not_tainted, is_tainted(var_not_tainted, contract)))
assert not is_tainted(var_not_tainted, contract)
6 changes: 2 additions & 4 deletions examples/scripts/export_dominator_tree_to_dot.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


if len(sys.argv) != 2:
print('python export_dominator_tree_to_dot.py contract.sol')
print("python export_dominator_tree_to_dot.py contract.sol")
exit(-1)

# Init slither
Expand All @@ -12,7 +12,5 @@
for contract in slither.contracts:
for function in contract.functions + contract.modifiers:
filename = "{}-{}-{}_dom.dot".format(sys.argv[1], contract.name, function.full_name)
print('Export {}'.format(filename))
print("Export {}".format(filename))
function.dominator_tree_to_dot(filename)


6 changes: 2 additions & 4 deletions examples/scripts/export_to_dot.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@


if len(sys.argv) != 2:
print('python function_called.py contract.sol')
print("python function_called.py contract.sol")
exit(-1)

# Init slither
Expand All @@ -12,7 +12,5 @@
for contract in slither.contracts:
for function in contract.functions + contract.modifiers:
filename = "{}-{}-{}.dot".format(sys.argv[1], contract.name, function.full_name)
print('Export {}'.format(filename))
print("Export {}".format(filename))
function.slithir_cfg_to_dot(filename)


Loading

0 comments on commit 3f70606

Please sign in to comment.