软件分析-数据流分析

Sl0th Lv4

数据流分析

数据流主要研究数据怎么在CFG(程序流程图 BB+边)中流动

基本术语

input and output states

汇聚的时候那个符号没有限制,可能是交集也可能是并集

83744840e76eb367512eaae50ced66b9_0
83744840e76eb367512eaae50ced66b9_0

states会被关联一个value

Reaching Definitions

注意:对于Entry的IN和OUT不作更新

根据算法得出在每个边里对每个destination是否能reach的抽象表达值

  • 当前块中的D,->1
  • 当前块中的D的左值,在其它块的D中也是左值时,kill掉 ->0

image-20231008152249586
image-20231008152249586

算法的结束条件是每个out和上一轮一致

每个out的变化规律:只会不变或增长有0->1 或 1->1,不会有1->0

因此算法一定会结束,会到达一个不动点

Live Variables

注意:对于Exit的IN和OUT不作更新

live

当一个变量在一条path里没有被redefine,则称为live的

抽象表示

与reaching destination类似,用一些列二进制数表示一些列变量

backward or forward

为了设计算法简便,使用backward

forward会使得判断live比较麻烦

image-20231008154741475
image-20231008154741475

对于S1 和 S2 使用may analysis,把in 取并集,OUT[B]=IN[S2] U IN[S1]

这些in和out都是变量的集合,

in->out的算法

  • IN[B]=$use_B$ U (OUT[B]-$def_B$)
  • 如果use在redefine之前,也认为live
  • 出现在左值说明被redefine
  • 出现在右值说明被use
  • 当IN不变时结束
  • 先kill define再加use

image-20231008161552115
image-20231008161552115

一般情况下,may analysis初始化是空,must analysis初始化是all

Available Expression

注意:对于Entry的IN和OUT不作更新

判断表达式是否available(是否还能用,与前一个块相比,表示的值是否变化)

image-20231008165300469
image-20231008165300469

数据抽象

1bit表示一个expression

forward

算法

  • 如果有变量被define,要kill掉含有该变量的表达式
  • 加上出现的表达式
  • 初始化时除了entry的out,其它都是全集

image-20231008165552249
image-20231008165552249

must analysis

image-20231008170945074
image-20231008170945074

常量传播

meetvalue规则

  • NAC:not a const
  • UNDEF:未定义
  • c:常量
image-20231019194129111
image-20231019194129111

UNDEF⊓v=v 解释:可能v是const,但这样一meet就成了const,似乎漏报了一个undef,但这关注的是常量传播,并不是live variables,

在做常量传播时,会假设程序是正确的,因此如果这里真的meet到了UNDEF,其实是不会走这条path的

transfer函数

image-20231019213608402
image-20231019213608402

  • 删除x变量(redefine了)
  • 标题: 软件分析-数据流分析
  • 作者: Sl0th
  • 创建于 : 2023-09-17 15:41:04
  • 更新于 : 2024-11-11 18:23:06
  • 链接: http://sl0th.top/2023/09/17/软件分析-数据流分析/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论