编程语言:
背景:在过去的十年中,语言的核心基本没有变化,但是程序变得显著的更大和更复杂;
挑战:如何确保大规模复杂程序的可靠性、安全性和其他承诺
程序的可靠性reliability:
程序的安全性security:
编译器优化
程序理解
Static analysis analyzes a program P to reason about its behaviors and determines whether it satisfies some properties before running P.
静态分析通过分析程序P来推理其行为,并在运行P之前确定其是否满足某些属性
Rice theory 莱斯定理: 不存在一个方法可以确定的给出一个程序是否满足一些非平凡属性的判断。
Any non-trivial property of the behavior of programs in a r.e. language is undecidable
r.e. (recursively enumerable) = recognizable by a Turing-machine
递归可枚举的语言就是图灵机可识别的语言
non-trivial 不简单,重要
以上表述为一个perfect static analysis是不存在的
从学术的角度来看,一个perfect的static analysis需要满足以下两个条件:
所以并不追求完美的静态分析,而是追求useful static analysis:
Mostly compromising completeness: Sound but not fully-precise static analysis
绝大多数静态分析追求的都是追求Soundness,会造成误报
Soundness is critical to a collection of important(static-analysis) applications such as compiler optimization and program verification.
Static analysis: ensure (or get close to) soundness, while making good trade-offs between analysis precision and analysis speed.
确保soundness,并在分析精度和分析速度之间做好权衡
Abstraction + Over-approximation
抽象和过近似
Example:
判断给定的程序中所有变量的符号:正、负或者是0.
transfer function定义了如何在抽象值上评估不同的程序状态,并且应该根据分析问题和不同程序状态的语义去定义
控制流分析,y的两个值是两个branch,执行分支不同会使z的值产生变化。并且在实际中枚举所有路径是不可能的,空间特别庞大,因此flow merging则被很多静态分析采用。