05.Slither Function对象常用方法分析使用示例
1.Function对象简介
function对象在slither中,当解析一个合约时,function对象表示合约中的一个函数。
function对象位于slither.core.declarations中,使用function函数时的引入方式如下,
from slither.core.declarations import Modifier, Event, EnumContract, StructureContract, Function
2.常用的属性和方法
2.1 取得函数的参数prameters
返回列表对象,列表的每一项对应着当前函数的参数。
示例:如果c合约中有个_transfer(address,address,uint256)
函数,可以打印出这个函数的3个参数
c.get_function_from_signature("_transfer(address,address,uint256)")).parameters
2.2 函数名称name
返回函数的名称。
2.3 函数中的各节点nodes
返回列表,列表每一项为Node对象
,组成函数/修饰符的CFG的节点列表.
2.4 入口点entry_point
返回Node对象
对象,返回CFG的入口节点。
<aside> 对函数进行遍历时,一般都是从函数的入口点向后遍历。
</aside>
2.5 函数读写的变量
对应的属性有: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)
2.6 判断该函数是不是具备某些特征
可以包括如下特征
函数名称 | 解释 |
---|---|
is_constructor | 当前函数是不是构造函数 |
is_fallback | 判断当前函数是否为fallback函数。 |
is_implemented | 判断是否有函数实现 |
is_protected | 判断函数是不是protected属性 |
contains_assembly | 函数中是否有包含assembly编码。 |
2.7 函数与变量的关系
这类函数主要用来判断函数与变量的关系。包括一个函数是否读写了某个变量,某个变量是否出现在函数的判断节点上,某个变量是否出现在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变量 |
is_reading(StateVariable)
输入一个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)
is_reading_in_conditional_node(Variable)
输入为Variable类型的变量。函数是否在if节点中对variable进行了读取。相当于函数中是否使...
版权声明
本文仅代表作者观点,不代表区块链技术网立场。
本文系作者授权本站发表,未经许可,不得转载。
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。