(智能合约实习)什么是静态分析?

283 阅读2分钟

1. 什么是静态分析?静态分析的作用是什么?

所谓静态分析,是指在代码运行前所做的一系列检测,用于分析代码的可靠性安全性性能方面的需求。大部分编译的优化(如 O1O3)都使用静态分析方法,或者用于理解程序时也会用到静态分析,这就是静态分析的作用。

2. 静态分析的应用有哪些?

静态分析可以用于检测:

  • 私有信息是否泄漏
  • 是否存在空指针问题
  • 是否有死代码

然而,完美的静态分析是不存在的

静态分析的完整程度可以用以下三个词来形容:

  1. Complete:程序报出的一些正确问题。
  2. Truth:程序报出所有正确的问题。
  3. Sound:程序报出的所有问题。

在静态分析中,妥协可能会导致漏报误报。即便如此,宁可误报也不漏报。正确性、精度和速度之间需要进行权衡。

静态分析的步骤:

  1. 抽象
  2. 过度近似

在控制流中,汇聚的地方通常为 unknown

3. 编译器和静态分析的关系是什么?

编译器的流程如下:

Source Code --> Scanner (lexical analysis, use Regular Expressions for Token) 
             --> Parser (Syntax Analysis, use Context-Free Grammar to AST) 
             --> Type Checker (use Attribute Grammar to Decorated AST) 
             --> Translation (to IR in Statics) 
             --> Code Generator 
             --> Machine Code

4. AST 与三地址码的区别

如图1所示,IR 与汇编语言非常接近。AST(抽象语法树)与编程语言紧密相关,而 IR(中间表示)与编程语言关系不大,而且IR 很简洁。

三地址码(3AC)每一句最多有一个符号(如变量名、常量或编译器生成的临时变量)。

5. 什么是 Soot?

Soot 是用于 Java 的静态分析框架,如图2所示。

方法签名:

类名: 返回类型 方法名(参数)

在 IR 中还有一种格式叫做 SSA(静态单赋值形式),在分析代码时,同一个变量会加上 p1p2 等序号。