From 南京大学大学-静态程序分析课程-李樾和谭添老师
SA(Static Analysis)是 PL(Program Language) 的一个部分。
PL 具有 3 个部分:
如下图所示:
虚线红框的内容就是指 Static Analysis,它是 Program Language 在应用中的一个子集
为什么 Static Analysis 很重要?
其原因在于我们对程序语言的语用需求增加了,那么就导致了程序代码变得越来庞大且复杂,这就进一步带来了一系列挑战:程序可靠性难达到,安全性难保证,性能提升,程序理解难(IDE对程序代码的识别)
Static Analysis 能干嘛?
所以,我们需要用 Static Analysis 技术来进行:
Static analysis analyzes a program P P P to reason about its behaviors and determines whether it satisfies some properties before running P P P.
静态分析就是在程序运行前,去了解程序的行为并且确定这些行为能不能被实现。
比如:
很遗憾,根据 Rice 定理:不可能通过静态分析来准确地判断程序的真实行为。
Any non-trivial property of the behavior of programs in a recursively enumerable language is undecidable.
递归可枚举语言中的程序行为的任何非平凡性质都是不可判定的。
什么是递归可枚举语言(recursively enumerable language)?
就是图灵机可识别的语言,基本上能见到的编程语言都是递归可枚举语言。
什么是 non-trivial property?
A property is trivial if either it is not satisfied by any recursively enumerable language, or if it is satisfied by all recursively enumerable languages; otherwise it is non-trivial.
简单来说:non-trivial 的性质就是有趣的性质,只要跟运行时的行为沾边的性质都是 non-trivial 的性质。
总的来说,根据 Rice’s Theorem , 一个 Perfect 的 Static Analysisi 是不存在的!
什么是 perfect ? perfect 就是既 Sound 又 Complete !
Sound
Sound 的意思就是 Overapproximate(过近似)
Complete
Complete 的意思就是 Underapproximate(欠近似)
他们的关系如下图所示
Static Analysis: ensure (or get close to) soundeness, while making good trade-offs between analysis precision and analysis speed.
确保 soundeness 的前提下,使得精度和速度具有有效的平衡,才是一个有用的 Static Analysis。
Abstraction + Overapproximate
(抽象)+(过近似)
Determine the sign (+, -, or 0) of all the variables of a given program.
Abstraction
把程序中真实的值,抽象成我们分析的值
Overapproximate: Transfer Function
设计我们的 Transfer Function(转换函数),即定义一套规则,把抽象值进行转换。比如我们设计的转换规则如下:
根据这套规则,我们来分析一个程序,从而可以得到如图中的 3 个结论: