目录:
编译器和静态分析的关系
AST vs IR
IR:3-地址代码(3AC)
实际静态分析器的3AC—Soot(Java)
SSA-静态单赋值
基本块(BB)
控制流图(CFG)
1.编译器和静态分析的关系
源码->(Scanner - 词法Lexical分析-Regular Expression)->(Parser- 语法Syntax分析-Context-Free Grammar), 生成AST ->(Type Checker - 语义Semantic分析 - Attribute Grammar),生成 Decorated AST -> Translator,生成IR,进行静态分析 -> Code Generator
1-1-编译器原理.png
2.AST vs IR
AST :高级,更接近于语法结构,依赖于语言种类,适用于快速类型检查,缺少控制流信息
IR:低级,更接近于机器码,不依赖语言种类,压缩且简洁,包含控制流信息。是静态分析的基础
1-2-AST&IR.png
3.IR:3-地址代码(3AC)
1234567// 最多1个 ...
目录:
Motivation
指针分析介绍
影响指针分析的关键要素
分析哪些语句
重点:
什么是指针分析?影响指针分析的关键因素是什么?指针分析要分析哪些指令?
1.Motivation
指针分析必要性:
6-1-PTA-motivation.png
2.指针分析
目标:分析程序指针可以指向哪些内存。对于Java等面向对象语言,主要分析指针指向哪个对象。
说明:指针分析属于may analysis,分析的结果是某指针所有可能指向哪些对象,是个over-approximation集合。
示例:面向对象语言中的指针指向问题。对于setB()函数,this指向new A(),因为是调用者是a.setB();setB()中的b是x传过来的,所以b指向new B(),A.b指向 new B()。
6-2-1-PTA示例.png
区别:
指针分析:分析指针所有可能指向的对象。
别名分析:分析两个指针是否指向相同的对象,可通过指针分析来推导得到。
应用:基本信息(别名分析/调用图),编译优化(嵌入虚拟调用),漏洞(空指针),安全分析(信息流)。
3.影响指针分析的关键要素
指标:精 ...
目录:
指针分析规则
如何实现指针分析
指针分析算法
指针分析如何处理函数调用(过程间指针分析)
重点:
理解指针分析的规则、指针流图PFG、指针分析算法。
理解指针分析调用函数的规则、过程间指针分析算法、实时调用图构建。
1.指针分析规则
首先分析前4种语句:New / Assign / Store / Load。
指针分析的域和相应的记法:变量/函数/对象/实例域/指针,用pt表示程序中的指向关系(映射)。
7-1-1-标记方法.png
规则:采用推导形式,横线上面是条件,横线下面是结论。
New:创建对象,将new T()对应的对象oi加入到x的指针集。
Assign:将y的指针集加入到x对应的指针集。
Store:让oi的field指向oj。
Load:Store的反操作。
7-1-2-规则.png
2.如何实现指针分析
算法要求:全程序指针分析,要容易理解和实现。
本质:在指针(变量/域)之间传递指向信息。Andersen-style分析(很普遍)——很多solving system把指针分析看作是一种包含关系,eg,x = y,x包含y。
问 ...
目录:
数据流分析总览
预备知识
Reaching Definitions Analysis (may analysis)
Live Variables Analysis (may analysis)
Available Expressions Analysis (must analysis)
重点:
理解3种数据流分析的含义,如何设计类似的算法,如何优化
理解3种数据流分析的共性与区别
理解迭代算法并弄懂算法为什么能停止
1.数据流分析总览
may analysis:输出可能正确的信息(需做over-approximation优化,才能成为Safe-approximation安全的近似,可以有误报-completeness),注意大多数静态分析都是may analysis
must analysis:输出必须正确的信息(需做under-approximation优化,才能成为Safe-approximation安全的近似,可以有漏报-soundness)
Nodes (BBs/statements)、Edges (control flows)、CFG (a progra ...
关于这一节zcc的笔记已经够完美了,我就直接在他基础上记录了。
目录:
迭代算法-另一个角度
偏序(Partial Order)
上下界(Upper and Lower Bounds)
格(Lattice),半格(Semilattice),全格和格点积(Complete and Product Lattice)
数据流分析框架(via Lattice)
单调性与不动点定理(Monotonicity and Fixed Point Theorem)
迭代算法转化为不动点理论
从lattice的角度看may/must分析
分配性(Distributivity)和MOP
常量传播
Worklist算法
重点:
上节课是介绍了3种数据流分析迭代算法,本节课将从数学理论的角度来讨论数据流分析,加深对数据流分析算法的理解。
1.迭代算法-另一个角度
本质:常见的数据流迭代算法,目的是通过迭代计算,最终得到一个稳定的不变的解。
(1)理论
定义1:给定有k个节点(基本块)的CFG,迭代算法就是在每次迭代时,更新每个节点n的OUT[n]。
定义2:设数据流分析的值域是V,可定义一个k-元组: ( ...