static analysis conclusion

2023-01-27

在学习了将近一个月的static analysis 的理论部分后,我发现得对它做个纵向的归纳,方便理解.

1. static analysis来自于哪

从源码开始,经历了词法分析语法分析语义分析三个步骤后得到抽象语法树(AST),再经过一些类型检测(type checker)后得到修饰的AST,在Translator层,如果不是转换成汇编代码,而是转换成IR(Intermediate Representation)static analysis就是在IR伤进行分析的。

2. BB(Basic Block)

IR上进行更进一步的分析,说白了就是对IR进行一定程度的组织就能得到 BBs,组织BBs的规则如下:
一段IR中的 第一条指令、jump指令的目标、跳转指令后的那条指令 ,都是一个BB的入口,可以通过找入口来生成BBs

3. CFG(Control Flow Graph)

BBs的基础上,进行更进一步的解析,能得到CFG
其算法如下:

  1. BB是CFG的节点,首先需要生成BBS
  2. 画边

    A的末尾和B的开头之间有跳转指令,连边 B直接跟在A后面且A不以无条件跳转指令结束

  3. 替换标签(比如跳转到第几条指令变为 跳转到块几)

application: data flow analysis

CFG开始,就能进行static analysis的分析了,最早见到的应用就是 Data Flow Analysis
我们学了3种不同的应用,包括如何进行建模,算法细节,等等

4. ICFG(Interprocedual CFG)

之前学习过的data flow analysis,在分析时,我们忽略了函数间的调用情况,如果在代码中存在函数调用,在进行分析时如果忽略了函数的信息,会导致分析极其不精确,因此需要过程间分析(Interprocedual Analysis),将函数调用时产生的信息也纳入计算,提高分析的精确性

为了能进行过程间分析,我们又引入了一种新的图,Call Graph(本质上是函数间的调用关系图)

标题中出现的ICFG,其定义如下: 通过构建ICFG,我们能够更为精确地对程序进行分析,即我们可以分析经过函数调用后的返回值等等

构造call graph的方法有很多,我们只学习了其中2种方法

Class Hierarchy Analysis(CHA)

CHA分析比较快,但是仍然存在精度缺失的问题(会造成很多冗余的类信息加入)

值得一提的是,在CHA的加持下,在上述提到的应用(data flow analysis)可以运行得更加精确

Pointer Analysis

Pointer Analysis是很多分析的基础,它的分析能够得到更准确的ICFG,但是相应的,比CHA更加耗时,算法也更加复杂,学习起来更加费力,其引入了PFG(Pointer Flow Graph)来方便得描述指针间的关系。

Pointer Analysis with Context-Sentivity

上面提到的指针分析,其实是上下文不敏感(Context-Insensitivity)的,如果使用上下文敏感(Context-Sensitivity)的话,可以使得分析更加精确。上下文敏感其实是一种分析的思路,不仅仅可以应用到指针分析当中,其他分析也可以应用

5. Static Analysis for security

static analysis 在安全相关的领域里也可以应用,首先老师对安全的要求做了解释,并抽象出模型供static analysis使用,并提出了 taint analysis(污点分析)的技术概念

6. Datalog-Based Program Analysis

在一开始讲解的算法,其实只提供了具体的思路,对于具体实现是没有详细描述的。
如果使用平常使用的计算机语言(如c/c++、java、python)等等,实现起来很复杂
而利用 Datalog-Based Program来实现static analysis的话,能打打简化实现算法的难度,可读性十分强