|
|
|
from slither import Slither
|
|
|
|
from slither.analyses.data_dependency.data_dependency import is_dependent, is_tainted, pprint_dependency
|
|
|
|
from slither.core.declarations.solidity_variables import SolidityVariableComposed
|
|
|
|
|
|
|
|
slither = Slither('data_dependency.sol')
|
|
|
|
|
|
|
|
contract = slither.get_contract_from_name('Simple')
|
|
|
|
|
|
|
|
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)))
|
|
|
|
assert not is_dependent(source, destination, 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)))
|
|
|
|
assert not is_tainted(source, contract)
|
|
|
|
print('{} is tainted {}'.format(destination, is_tainted(destination, contract)))
|
|
|
|
assert is_tainted(destination, contract)
|
|
|
|
|
|
|
|
contract = slither.get_contract_from_name('Reference')
|
|
|
|
|
|
|
|
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)))
|
|
|
|
assert not is_dependent(source, destination, 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)))
|
|
|
|
assert not is_tainted(source, 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)))
|
|
|
|
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)))
|
|
|
|
assert is_tainted(destination_indirect_2, contract)
|
|
|
|
|
|
|
|
print('SolidityVar contract')
|
|
|
|
|
|
|
|
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)))
|
|
|
|
assert is_dependent(addr_1, 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('{} 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)))
|
|
|
|
assert not is_dependent(destination, source, contract)
|
|
|
|
print('{} is dependent of {}: {} (derived)'.format(destination, source, is_dependent(destination, source, contract_derived)))
|
|
|
|
assert is_dependent(destination, source, contract_derived)
|
|
|
|
|