指针分析与副作用分析
在软件开发中,对程序进行精确的分析是至关重要的,特别是在处理库模块和客户端模块时。本文将介绍一种构建库模块摘要信息的方法,以及如何利用这些摘要进行客户端模块的单独指针分析和修改分析。
1. 整体程序分析
整体程序分析是后续最坏情况分析和基于摘要分析的基础。假设使用简化的类 C 程序表示,结构和数组被视为整体对象,不区分其单个元素。malloc 等函数调用被替换为“x = &heapi”形式的语句。
- 变量分类 :程序表示中的变量集合 V 可分为全局变量、过程变量(表示过程名称)、局部变量(包括形式参数)和堆变量。
- Andersen 指针分析 :构建一个指针图,节点对应 V 中的变量,有向边 (v1, v2) 表示 v1 可能包含 v2 的地址。每个语句定义一个转移函数,用于向指针图添加边。分析从空图开始,应用转移函数直到达到固定点。
- 修改分析 :定义一个修改算法,为每个语句 s 计算一组修改的变量 Mod(s)⊆V。该算法通过添加两个变量过滤器来补偿底层指针分析的不精确性。
以下是一个示例程序:
proc main() {
proc exec(p,fp) {
local x,y,z,w
local s,u,q,t
1: x = 1
11: s = 3
12: u = 4