在学习了将近一个月的static analysis
的理论部分后,我发现得对它做个纵向的归纳,方便理解.
- 1. static analysis来自于哪
- 2. BB(Basic Block)
- 3. CFG(Control Flow Graph)
- 4. ICFG(Interprocedual CFG)
- 5. Static Analysis for security
- 6. Datalog-Based Program 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
其算法如下:
- BB是CFG的节点,首先需要生成BBS
- 画边
A的末尾和B的开头之间有跳转指令,连边 B直接跟在A后面且A不以无条件跳转指令结束
- 替换标签(比如跳转到第几条指令变为 跳转到块几)
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
的话,能打打简化实现算法的难度,可读性十分强