软件分析笔记:2.数据流分析
1数据流分析基础
1.1停机问题-抽象方法
针对基础篇中的停机问题,我们可以试用抽象方法去尝试解决问题。邪恶程序存在的关键在于程序中有if存在 。因此可以采取以下方式。
1.1.1忽略掉所有程序的if条件部分
void Evil(){
if(!Halt(Evil))return;
else while(1)
}
抽象成
void Evil(){
向左走return;
向右走while(1);
}
语义:“向左走/向右走”为非确定性选择,程序随机从“向左走” 和“向右走”后面的语句中选择一条执行。
1.1.2忽略所有条件判断中的条件,一律抽象为不确定选择
void Evil(){
再来一次
向左走goto再来一次;
向右走return;
}
1.1.3抽象过程分析
针对给定输入
- 原始程序只有一条执行路径,抽象程序上有多条执行路径
- 原始程序的执行路径一定包含在抽象程序的执行路径中
停机问题
- 原始程序停机:存在自然数n,程序的执行路径长度 小于n
- 抽象程序停机:存在自然数n,程序中所有执行路径 的长度都小于n
1.1.4停机问题的判定方法
绘制控制流图(结点为程序语句,边为语句间的转移 ), 如果控制流图上有环,则可能不终止,否则一定终止。
1.2符号分析
1.2.1分析内容
给定一个只包含浮点数变量和常量的程序,已知输入的符号,求输出的符号。
1.2.2符号分析的抽象
抽象符号
- 正 ={所有的正数}
- 零={0}
- 负= {所有的负数}
- 槑={所有的整数和NaN}
1.2.3符号分析的基本思路
给定程序的一条执行路径,我们能推出结果符号的抽象取值。
给定程序的两条执行路径,我们得到两个结果符号的抽象取值