@(静态分析)
编译器和静态分析的关系
AST vs IR
IR:3-地址代码(3AC)
实际静态分析器的3AC—Soot(Java)
SSA-静态单赋值
基本块(BB)
控制流图(CFG)
中间表示形式IR(通常是三地址码)之后进行静态分析,优化,检查。
IR是提供给静态分析程序的基础。
AST
IR
更高级,接近语法结构
更底层,接近汇编
依赖语言
不依赖语言
适用于快速类型检查
压缩简洁
缺乏控制流信息
包含控制流信息
通常认为IR是静态分析的基础
中间表示形式,右侧最多只有一个操作符
Address:
https://github.com/Sable/soot/wiki/Tutorials
最常用的Java静态分析框架
invokespecial: call constructor, call superclass methods, call private methods
invokevitual: instance methods call(virual dispath)
invokeinterface: cannot optimization, checking interface implementation
invokestatic: call static methods
Java7: invokedynamic -> Java static typing , dynamic language runs on JVM #让动态语言在JVM上运行
method signature: class name : return type method name(parameter1 parameter2)
给每一个定义变量一个新的命名,传递到接下来的使用当中,每个变量有一个定义(赋值的目标变量)。
每一个变量都有自己的定义
merge的地方会使用Phi funciton
优点:
缺点:
只有1个开头入口和1个结尾出口的最长连续的3-地址指令序列。
识别基本块的算法:首先确定入口指令,第一条指令是入口;任何跳转指令的目标地址是入口;任何跟在跳转指令之后的指令是入口。然后构造基本块,任何基本块包含1个入口指令和其接下来的指令。
基本块作为节点
添边规则:
将原本的语句变为BB再变成CFG
手机扫一扫
移动阅读更方便
你可能感兴趣的文章