Page 455 - 《软件学报》2026年第3期
P. 455
1418 软件学报 2026 年第 37 卷第 3 期
转边, 以构建控制流图. 然而, 仍然可能存在孤立的子图. 为保证行为序列的完整性, 如图 3 所示在孤立的子图上添
加连接边得到一个连通图. 第 3 阶段, 通过使用深度优先遍历算法来遍历构建的连通图, 得到智能合约操作码的行
为序列. 通过建立控制流关系和操作码之间的顺序依赖关系, 算法 1 确保了提取的行为序列的完整性.
算法 1. 智能合约行为序列算法.
输入: 操作码序列 opcodes;
输出: 行为序列 behavior_seq.
1. BEGIN
2. 控制流相关的操作码集合 Control, 基本块集合 basicblocks={}, 图 G<Block, E>
3. FOR opcode in opcodes DO //遍历操作码序列
4. IF opcode 是 Control 中的一种 THEN //比较得到最大的损失
5. 以 opcode 为基本块的最后一条指令, 得到一个基本块 block
6. 将 block 保存到基本块集合 basicblocks 中
7. END IF
8. END FOR
9. FOR block in basicblocks DO //遍历基本块集合
10. IF 当前基本块的最后一条指令是 JUMP 或 JUMPI THEN
11. 根据该基本块的跳转地址, 找到其跳转的基本块 block'
12. 添加 block 与 block'之间的跳转边
13. END IF
14. END FOR
15. 此时得到初始图 G'
16. IF G'中存在孤立基本块或孤立子图 THEN //与当前点的损失进行比较
17. 寻找以当前孤立基本块或孤立子图的起始指令–1 为结尾地址的上一基本块
18. 添加当前基本块与上一基本块之间的连接边
19. 得到完整的连通图 G
20. END IF
21. 深度优先遍历图 G, 得到行为序列 behavior_seq
22. END
Subgraph 1 Subgraph 2
Basicblock 1 Basicblock 3
Sequential
Jumping edge Jumping edge
dependency edge
Basicblock 2 Basicblock 4
图 3 连通图示意

