数据流分析的核心:How Data Flows on CFG?
将这句话展开来,所谓数据流分析就是:
How application-specific Data (对数据的抽象:+, -, 0 等……) Flows (根据分析的类型,做出合适的估算) through the Nodes (数据如何 transfer, 如 + op + = +) and Edges (控制流如何处理,例如两个控制流汇入一个BB) of CFG (整个程序) ?
不同的数据流分析,有着不同的data abstraction, flow safe-approximation(流动安全近似值)策略,transfer functions&control-flow handlings(转移函数和控制流处理)。
在这里就能明白数据流中的Node、Edge代表的含义,比例CodeQL中就用了这个Node,Edge含义。


在数据流分析中,我们会把每一个PP关联一个数据流值,代表在该点中可观察到的抽象的程序状态。
分析数据流有前向和后向两种:

每条语句 s 都会使程序状态发生改变。
B 的输出自然是其输入在经过多次转换后得到的状态。
而 B 的输入要根据数据流分析的需求,对其前驱应用合适的 meet operator 进行处理。后向分析时亦然。




到达定值可以用来分析未定义的变量。例如,我们在程序入口为各变量引入一个 dummy (假的)定值。当程序出口的某变量定值依然为 dummy,则我们可以认为该变量未被定义。
对于一条赋值语句 D: v = x op y,该语句生成了 v 的一个定值 D,并杀死程序中其它对变量 v 定义的定值。
程序中所有变量的定值。
可以用一个 bit vector 来定义,有多少个赋值语句,就有多少个位。


v = x op y,gen v, kill 其它所有的 v

这是一个经典的迭代算法。

这个算法可以用于寄存器分配,当一个变量不会再被使用,那么此变量就可以从寄存器中腾空,用于新值的存储。



可用表达式可以用于全局公共子表达式的计算。也就是说,如果一个表达式上次计算的值到这次仍然可用,我们就能直接利用其中值,而不用进行再次的计算。
程序中的所有表达式
bit vector 中,一个 bit 就是一个表达式




数据流分析的核心:How Data Flows on CFG?
将这句话展开来,所谓数据流分析就是:
How application-specific Data (对数据的抽象:+, -, 0 等……) Flows (根据分析的类型,做出合适的估算) through the Nodes (数据如何 transfer, 如 + op + = +) and Edges (控制流如何处理,例如两个控制流汇入一个BB) of CFG (整个程序) ?
不同的数据流分析,有着不同的data abstraction, flow safe-approximation(流动安全近似值)策略,transfer functions&control-flow handlings(转移函数和控制流处理)。
在这里就能明白数据流中的Node、Edge代表的含义,比例CodeQL中就用了这个Node,Edge含义。


在数据流分析中,我们会把每一个PP关联一个数据流值,代表在该点中可观察到的抽象的程序状态。
分析数据流有前向和后向两种:

每条语句 s 都会使程序状态发生改变。
B 的输出自然是其输入在经过多次转换后得到的状态。
而 B 的输入要根据数据流分析的需求,对其前驱应用合适的 meet operator 进行处理。后向分析时亦然。




到达定值可以用来分析未定义的变量。例如,我们在程序入口为各变量引入一个 dummy (假的)定值。当程序出口的某变量定值依然为 dummy,则我们可以认为该变量未被定义。
对于一条赋值语句 D: v = x op y,该语句生成了 v 的一个定值 D,并杀死程序中其它对变量 v 定义的定值。
程序中所有变量的定值。
可以用一个 bit vector 来定义,有多少个赋值语句,就有多少个位。


v = x op y,gen v, kill 其它所有的 v

这是一个经典的迭代算法。

这个算法可以用于寄存器分配,当一个变量不会再被使用,那么此变量就可以从寄存器中腾空,用于新值的存储。



可用表达式可以用于全局公共子表达式的计算。也就是说,如果一个表达式上次计算的值到这次仍然可用,我们就能直接利用其中值,而不用进行再次的计算。
程序中的所有表达式
bit vector 中,一个 bit 就是一个表达式



