Static Program Analysis : Introduction

402 阅读3分钟

Outline

  1. PL and Static Analysis

  2. Why learn static analysis

  3. What is static analysis

  4. static analysis features and example

  5. The X you need to understand in this lecture

Detail

PL and Static Analysis

2.png

程序设计语言主要有 theory,environment,application 三个分支,其中 theory 主要关于程序设计语言的基础理论,比如程序语言设计,语义逻辑等,environment 主要包括支持语言运行的基础设施,比如编译器,运行时系统,application 主要是程序分析的应用,比如静态分析,程序验证等。

近年来,程序设计语言的核心基本上变化不大,但是程序的规模飞速增长,如何为程序提供可靠性,安全性等保障成为越来越需要关心的一个问题,这就使得静态分析变得越来越重要。

Why learn static analysis

  • 静态分析在保障程序的以下性质的过程中起着重要的作用

  • Program Reliability: 空指针异常,内存泄漏, etc

  • Program Security:隐私泄露,注入攻击, etc

  • Compiler Optimization: 死代码消除,code motion, etc

  • Program Understanding: IDE 提示, etc

What is static analysis

静态分析就是在运行程序之前,(通过运行静态分析器)就获得关于程序的某些非平凡的性质(有实际应用作用的一般都是非平凡性质)。

1.jpg

以上就是一些程序的非平凡性质的例子。

一个完美的静态分析应该要精确的给出程序是否满足某个非平凡性质的回答(Yes or No),然而,Rice Theorem 指出并不存在一个完美的静态分析。

为了更好的理解何为完美的静态分析,下面用另外一种方式来描述何为一个完美的静态分析: a perfect static analysis should be complete and sound

3.png

上图描述了complete 和 sound 与 ground truth 之间的关系。soundness 保证了静态分析不会漏报,但是会误报,即产生 false positive,而 completeness 保证了静态分析不会误报,但是会漏报,即 false negative.

在实际应用时需要对 completeness 和 soundness 做一个折中,稍微牺牲某一边以提升另外一边,由于某些实际应用对 soundness (比如编译优化)的需求,实际中的做法是牺牲 completeness ,保证 soundness。

static analysis features and examples

Static Analysis : Bird Eye View, 用静态的思维来分析程序

4.png

上图中的第一个结果和第一个结果都是正确的,但是第一个结果的说法包含了动态的信息,它更精确,但是要给出这样的结果需要更多的 cost,结果 2 从静态的视角给出结论,牺牲了一些精度但是保证了 soundness 和效率,这正是实际应用中需要的。

Two Words to Conclude Static Analysis: Abstraction + Over-approximation

Abstraction: a mapping from concrete domain to abstract domain

Over-approximation:

  • Transfer Function: Transfer Function 定义了如何在抽象域上对每个表达式求值,不同的问题域需要定义不同的 transfer function

  • Control Flows: 控制流对程序的执行顺序建模,在交汇处做了合并.

5.png

The X you need to know in this lecture

sa01x.png

  1. static analysis 和 testing 的区别在于 static analysis 并不直接运行待测程序本身,而 testing 需要运行待测程序;static analysis 强调的是 soundness,而 testing 能保证的是 completeness

  2. soundness 就是只会多报,不会漏报,completeness 就是只会漏报,但是报出来的都是准的,false negative 就是漏报,false positive 就是误报

  3. 在一些应用里面比如编译优化和程序验证,没有 soundness 保证的话无法保证正确性。

  4. abstraction 是把具体的值映射为抽象的值,相当于对具体值做了等价类划分,over-approximation 定义了如何在抽象域上分析的规则。