Skip to content

定义Definition

上下文敏感的过程间分析

Context-sensitive interprocedural analysis · Interprocedurally valid paths

把函数出口连回所有调用者会产生什么假执行,调用串和摘要怎样约束返回。

形式陈述 ​

过程间分析把多个控制流图通过调用边与返回边连接起来。对调用点 c,记被调过程入口为 ef、出口为 xf、匹配的调用后位置为 rc。图上有 c→ef 和 xf→rc;实参与形参、返回值与目标变量的映射还需单独标在这些边上。

如果多个调用点都调用f,出口便连接多个返回位置。但一条真实执行只能返回当前栈顶那次调用的后继,不能任意选出口的另一条边。给每条调用边标记 callc、匹配返回边标记 returnc。一条从程序入口出发的路径称为调用返回合法,当沿路径执行下列栈操作始终成功:调用时压入c,返回时必须弹出同一个c。

路径可以在函数内部结束,因此最后栈不一定为空。若开始和结束在同一调用层,而且中间不弹出起始层,称同层合法路径。下推栈使这个定义能够表达任意深递归。

上下文敏感分析以某种表示区分不同调用环境。常见接口是 X[v,κ],在程序点v和上下文 κ 下记录抽象事实。上下文可以是有界调用串,也可以通过过程摘要隐式保留。这里的“上下文”不等于分支条件;区分调用者仍可能把函数内部两个不相容分支合流。

直觉

过程内分析把信息沿后继边传走就够了。跨函数后,一条出口边还承诺“我属于哪次尚未完成的调用”。如果把这层配对丢掉,就像把两次电话的回答接给错误的来电者。

调用图决定有哪些可能的被调函数;上下文敏感分析决定这些调用的事实如何传入、怎样回到对应调用者。目标集合精确不代表返回已经匹配,反之亦然。

例子与边界

同一个恒等函数也会被分析“串线” ​

考虑纯函数 identity(z){ return z; },以及

text
a = identity(0)       // c1,返回到r1
b = identity(1)       // c2,返回到r2
assert(a == 0 && b == 1)

真实执行分别把0交给a、1交给b。若只为identity入口保存一个抽象状态,参数z可能被合并为“0或1”;出口的统一结果再流到两个返回点,分析可能无法证明断言。

更明显的假路径是:从 c1 进入identity,却沿 returnc2 到 r2。图上可达,调用栈却含 c1,所以该返回不合法。最精确的过程内常量传播也无法修复一条从模型层就接错的返回边。

调用串如何区分,又如何合并 ​

长度1的调用串把identity的两次入口分别记为 κ=[c1] 与 [c2],于是得到z=0和z=1两份状态。分析递归调用链 c1,d,d,d,… 时,只保留最近一个调用点会使多层上下文都映到 [d],因此状态仍有限。

截断不是把栈简单弹一次就能求逆。例如长度1上下文 [d] 可能来自 [c1] 压d,也可能来自 [c2] 压d。返回时必须把结果传给所有与该抽象进入关系相容的调用者,或显式记录调用关联;直接删掉d并假装得到了唯一旧上下文,会漏掉行为。

长度k的调用串有至多 1+c+⋯+ck 种,其中c是调用点数。固定k保证有限,不保证增加k总能消除特定伪路径;更深的相同调用后缀仍会合并。

摘要可以不逐个复制所有调用上下文 ​

对identity,入口到出口摘要就是函数 Summary(s)=s,精确保存输入值与输出值的关系。调用处分别应用它:0映到0,1映到1。若只把摘要存成“出口可能是0或1”的集合,就已经丢掉这种输入输出关联。

对于有全局状态的过程,摘要要描述可能影响的全局量;对堆写入,还要接入别名信息。递归使摘要互相依赖,需要求解不动点。单调数据流分析提供迭代骨架,具体摘要的表示决定是否有限、能否高效合成。

推论与应用

应区分三个精度维度。流敏感性按程序点保留顺序;上下文敏感性区分调用环境;路径敏感性保留足以区别分支条件的信息。一个分析可以上下文敏感但流不敏感,也可以在每个函数内很精确却把所有调用者合并。

即便只合流调用返回合法路径,仍可能包含不可行分支。例如先判断x>0,随后在没有改变x时又走x≤0分支,这是一条调用返回配对正确、但数值条件矛盾的图路径。因此“对所有合法过程间路径精确”不能写成“对真实程序执行精确”。

对一般有限抽象域,复制每个 [v,κ] 状态可直接得到有限方程系统;成本至少乘以上下文数量,格高度和单次转移成本仍需另计。某些分配性问题可用摘要关系而不枚举所有调用串,IFDS与IDE便沿这条路计算匹配调用返回的路径结果。

单元任务入口:识别三种不同的伪告警 ​

给一个有两次identity调用、一个共享指针和一处分支的程序,先画出调用点配对,再标出三种不确定性:错误返回边、指针may-alias、多条分支合流。只有第一种能仅靠调用返回匹配解决;第二种需要指针抽象,第三种需要更强的路径条件。

对本页程序,验收解答必须给出 c1returnc2 非法的栈证据,并列出identity摘要如何分别作用于0和1。若只是画两份函数副本,却没有说明递归时如何截断或复用,分析模型仍不完整。

参考资料
关系图谱12 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系