05.Slither Function对象常用方法分析使用示例

  • 小驹
  • 更新于 2023-06-28 16:23
  • 阅读 921

介绍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 image.png

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进行了读取。相当于函数中是否使...

剩余50%的内容订阅专栏后可查看

点赞 1
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

1 条评论

请先 登录 后评论
小驹
小驹
0xcD46...3461
weixin: xiaoju521区块链安全分析,欢迎私信沟通交流