介绍Slither中Function对象常用的方法及应用示例
function对象在slither中,当解析一个合约时,function对象表示合约中的一个函数。
function对象位于slither.core.declarations中,使用function函数时的引入方式如下,
from slither.core.declarations import Modifier, Event, EnumContract, StructureContract, Function
返回列表对象,列表的每一项对应着当前函数的参数。
示例:如果c合约中有个_transfer(address,address,uint256)
函数,可以打印出这个函数的3个参数
c.get_function_from_signature("_transfer(address,address,uint256)")).parameters
返回函数的名称。
返回列表,列表每一项为Node对象
,组成函数/修饰符的CFG的节点列表.
返回Node对象
对象,返回CFG的入口节点。
<aside> 💡 对函数进行遍历时,一般都是从函数的入口点向后遍历。
</aside>
对应的属性有:variables_read/variables_written/state_variables_read/state_variables_written
可以取得当前函数读取/写入过的变量/状态变量
使用示例:
from slither.core.declarations import Function, FunctionContract, Contract
slither = Slither('./test/test2/hackdao.sol')
c: Contract = slither.get_contract_from_name("Token")[0]
f: Function = c.get_function_from_signature("_transfer(address,address,uint256)")
for v in f.variables_read:
print(v.name)
可以包括如下特征
函数名称 | 解释 |
---|---|
is_constructor | 当前函数是不是构造函数 |
is_fallback | 判断当前函数是否为fallback函数。 |
is_implemented | 判断是否有函数实现 |
is_protected | 判断函数是不是protected属性 |
contains_assembly | 函数中是否有包含assembly编码。 |
这类函数主要用来判断函数与变量的关系。包括一个函数是否读写了某个变量,某个变量是否出现在函数的判断节点上,某个变量是否出现在require或者assert语句中。
函数 | 解释 |
---|---|
is_reading(StateVariable) | 当前函数对象是否读取了这个变量 |
is_writing(Variable) | 当前函数对象是否写入过这个变量 |
is_reading_in_conditional_node(Variable) | 是否在if节点中对variable进行了读取 |
is_reading_in_require_or_assert(Variable) | 是否在require 语句或者 assert中读取过Variable变量 |
输入一个StateVariable
,输出当前函数对象是否读取了这个变量。
示例:
# 在hackdao.sol文件中,Token合约的_transfer函数中是否读取了_balances状态变量。
from slither.slither import Slither
from slither.core.variables.state_variable import StateVariable
from slither.core.declarations import Function, FunctionContract, Contract
slither = Slither('./test/test2/hackdao.sol')
# print("slither:", slither)
c: Contract = slither.get_contract_from_name("Token")[0]
balances_stat: StateVariable = c.get_state_variable_from_name("_balances")
transfer_fun: Function = c.get_function_from_signature("_transfer(address,address,uint256)")
is_reading = transfer_fun.is_reading(balances_stat)
print(is_reading)
输入为Variable类型的变量。函数是否在if节点中对variable进行了读取。相当于函数中是否使...
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!