14-指针分析
别名 Alias:两个符号指向同一个内存地址
指针分析 Pointer Analysis:分析程序中指针的别名关系
目的:确定哪些指针可能指向同一内存位置,以便进行优化
指针别名分析
May analysis:确定哪些指针可能指向同一内存位置,相当于 Must-not analysis(不满足 May analysis 的指针一定不别名)
Sound/Over-approximation:粗略判定,可能包含并非别名的别名关系
Must analysis:确定哪些指针一定指向同一内存位置
流敏感的指针分析
开销过大
流不敏感的指针分析
y = &x; // 取地址
y= x; // 赋值
*y = x; // 解引用,store
y = *x; // 取值,loadpts(x),x作为指针,可能指向的内存位置集合
Andersen 算法
y = &x
y = x
*y = x
y = *x
图
节点:变量/内存位置
边:
通过动态维护传递闭包来添加新约束
Steensgaard 算法
y = &x
y = x
*y = x
y = *x
图
节点:变量/内存位置
边:
一个节点只有一条出边:转化为并查集,对于
=直接合并父节点可能会遗漏一些别名关系
健全性
✅
✅
效率
几乎线性
接近立方
精度
合一式,较不精确(欠拟合)
包含式,更精确(过拟合)
两者都是 May analysis
基于 Datalog 的分析
逻辑范式编程语言
定义一系列 Facts 和 Rules
通过查询(Query)来推导新的 Facts
Datalog
Prolog 的子集
规则顺序无关
非图灵完备
Predicate:谓词,n-元关系
Rule:规则,
h :- b1, b2, ..., bn,表示如果 都为真,则 也为真Rule 必须对所有取值都成立
规则可以递归
规则中可以出现
所有未定义内容为假
Datalog 分析 Reaching Definitions
def(B,N,X):表示在基本块B中,变量X在第N条语句被定义succ(B,N,C):表示基本块C的后继是有N条语句的基本块Brd(B,N,C,M,X):变量X在基本块C的第M条语句被定义,并且可到达基本块B的第N条语句
基于控制流图,定义
def和succ谓词查询
rd时,求解器会自动基于def和succ进行推导
Datalog 分析 Pointer Analysis
原理类似,略
Object Sensitivity
面向对象语言的 Context-Sensitivity
区分对象的方法调用
最后更新于