写在前面
由于要做一个软件分析+AI方向的项目,写博客记录一下学习的内容,也是激励自己学习的动力吧。软件分析学习主要参考北大熊英飞老师的课程,链接:https://xiongyingfei.github.io/SA/2020/main.htm。
第一章
运用哥德尔不完备定理论证了程序中的缺陷不可能完全判定。哥德尔定理:包含自然数和基本算术运算的系统一定不完备,即包含一个无法证明的定理。哥德尔定理证明略,与停机问题证明类似,证明下面的程序是否可以停机:
void Evil() {
if (!Halt(Evil) return;
else while(1);
}
显然可以得出矛盾。
这些问题属于不可判定性问题。通过莱斯定理得到程序哪些属性是可判定的。莱斯定理:把任意程序看成输入到输出上的函数,该函数的所有非平凡属性都不存在可以检查该属性的通用算法,证明略。
故只能近似求解判定问题。减少回答的信息,但将回答中的信息量与真正的解逼近。
近似的解中很重要的性质是soundness,要保证分析不改变程序语义。
近似方法1–抽象:将原问题投射到一个抽象域里求解,缩小问题的范围。
方法2–搜索:这个很好理解。
第二章
停机问题
使用抽象近似求解停机问题:忽略条件判定,改为让程序随机走return或while(1)。我们会得到结果:不知道程序会不会停机,虽然信息量更小,是一个近似值,但我们得到了结果。进一步说就是原始程序有一条执行路径&#x