数据流方程解的精确性和安全性 数据流方程通常没有唯一解。 目标是寻找一个最“精确的”、满足约東 的解 精确:能够进行更多的改进 满足约束:根据分析结果來改进代码是安全的
数据流方程解的精确性和安全性 • 数据流方程通常没有唯一解。 • 目标是寻找一个最“精确的”、满足约束 的解 – 精确:能够进行更多的改进 – 满足约束:根据分析结果来改进代码是安全的
到达定值(1) ·到达定值 如果存在一条从定值d后面的程序点到达某个点p的 路径,且这条路径上d没有被杀死,那么定值d到达 ·杀死:路径上对X的其他定值杀死了之前对ⅹ的 定值; 考處到间接赋值,如果定值可能不是对x进行复制, 则不能杀死这个定值 直观含义 如果d到达p,那么在p点使用的x的值就可能是由d 定值的
到达定值(1) • 到达定值 – 如果存在一条从定值d后面的程序点到达某个点p的 路径,且这条路径上d没有被杀死,那么定值d到达 p • 杀死:路径上对x的其他定值杀死了之前对x的 定值; – 考虑到间接赋值,如果定值可能不是对x进行复制, 则不能杀死这个定值 • 直观含义 – 如果d到达p,那么在p点使用的x的值就可能是由d 定值的
到达定值(2) 到达定值的解允许不精确。但必须是安全 的 分析得到的到达定值可能实际上不会到达; 但是实际到达的一定被分析出来。否则不安全 用途 确定ⅹ在p点是否常量 忽略实际的到达定值使得变化的值被误认为常量; 将这些值替换为常量会引起错误.不安全 过多估计则相反 确定变量是否先使用后定值
到达定值(2) • 到达定值的解允许不精确,但必须是安全 的 – 分析得到的到达定值可能实际上不会到达; – 但是实际到达的一定被分析出来,否则不安全 • 用途: – 确定x在p点是否常量 • 忽略实际的到达定值使得变化的值被误认为常量; 将这些值替换为常量会引起错误,不安全 • 过多估计则相反 – 确定变量是否先使用后定值
到达定值的例子 ENTRY B1中全部定值到达B的 41:i=m-1B d a.a=ul 开头 d到达B2的开头(循环) d: i=i+1 B2 d,被d杀死,不能到达 B3、BA的开头; a u2 d4不能到达B2的开头, d,: i=u3 B 因为被d杀死 d到达B的开头 EXIT
到达定值的例子 • B1中全部定值到达B2的 开头; • d5到达B2的开头(循环) • d2被d5杀死,不能到达 B3、B4的开头; • d4不能到达B2的开头, 因为被d7杀死; • d6到达B2的开头
语句/基本坎的传递方程(1) ·定值d:u=V+w 生成了对变量u的定值d;杀死其他对u的定值; 生成杀死形式:fA(S)=gend∪(xkl) gen{d},klla={程序中其他对u的定值} 生成杀死形式的函数的并置(复合)仍具有 这个形式 -f(f (x) )=gen2 U(gen, U(x-killy-kill2) =(gen2U(gen1-kl2)∪(x-kil1∪kll2) 生成的定值:由第二部分生成、以及由第一个部分 生成且没有被第二部分杀死: 一杀死的定值:被第一部分杀死的定值、以及被第二 部分杀死的定值
语句/基本块的传递方程(1) • 定值 d: u=v+w – 生成了对变量u的定值d;杀死其他对u的定值; – 生成-杀死形式:fd (s)=gend∪(x-killd ) – gend={d},killd={程序中其他对u的定值} • 生成-杀死形式的函数的并置(复合)仍具有 这个形式 – f2 (f1 (x)) = gen2 ∪ (gen1 ∪ (x-kill1 ) - kill2 ) = (gen2∪(gen1 -kill2 ))∪(x-kill1∪kill2 )) – 生成的定值:由第二部分生成、以及由第一个部分 生成且没有被第二部分杀死; – 杀死的定值:被第一部分杀死的定值、以及被第二 部分杀死的定值