“算法输出可以保留每个摘要的推导来源。检查一个污染告警时,就能沿事实边和匹配调用返回恢复见证;但见证仍是一条抽象合法路径,若分支条件不相容,还需要后续可行性检查。IDE进一步在这些依赖边上附值…”
形式陈述
IDE将IFDS的“一个事实在不在集合里”推广为“每个事实携带哪个抽象值”。它取有限事实域D和一个有限高度的完备格L,程序点上的环境为
合流逐分量进行:
用零事实
分配律允许把环境分成逐坐标贡献后再合成。没有边相当于恒为
沿一条路径,边标签按执行顺序作函数复合;多条路径汇合,则取函数的逐点上确界。过程摘要也携带这样的值函数,并继续保持调用返回匹配。
要得到可执行终止的算法,还需为实际使用的边函数族规定有限或可终止的表示:能计算复合、逐点合流和相等,且摘要迭代不会无限产生新表示。不能只写“L高度有限”便忽略任意函数
直觉
IFDS的边
一条摘要记录输入输出之间的函数关系。调用同一过程时,传入3可得3、传入4可得4;不会因为过程曾被两种输入调用,就立即把每个调用的返回都混成未知。
例子与边界
复制常量传播
取平坦常量格
语句 y=x 给边 y=3 则从零事实向y提供常量3。对
x = 3
y = x
z = identity(y)
x通过恒等边传到y,identity的匹配摘要再把y传到z,最终z=3。把第一句换成分支 x=3 或 x=4,合流后得到
摘要合流必须仍能表示
考虑一个过程:一条分支令输出等于输入,另一条令输出为3。它的摘要不是简单的“恒等或常量3”二选一,而是函数
输入3时输出仍为3;输入4时为
对只含复制与整数字面量的简单语言,可使用恒等、各常量函数、
普通常量传播未必分配
两条路径分别到达环境 z=x+y。逐路径计算都得z=3,所以路径结果的合流仍为3;但先把两环境逐变量合流,会得到x=y=
因此普通双变量算术转移不满足所需分配律。复制常量传播干脆把这类复合表达式结果保守地置为未知,从而落入可处理的分配子类。原始IDE研究也处理某些单变量线性常量传播,但这不等于任意关系型数值分析都能直接使用同一框架。
推论与应用
第一阶段把IFDS的路径边从“存在/不存在”改成摘要函数:普通边在已有摘要后复合;同一端点对的不同摘要逐点合流;调用与返回通过匹配的被调摘要连接。第二阶段再把程序入口的初值沿这些摘要求出各程序点的具体抽象值。将关系计算与初值求值分开,可以让摘要被不同调用输入复用。
正确性依赖两个分配:程序转移对环境合流分配,边函数的表示能忠实完成路径复合与路径合流。由合法路径分解可证明摘要覆盖所有且仅有模型允许的调用返回路径,再把函数应用到初值,得到该模型的MVP值。
设原过程间图有
IDE适合把布尔依赖升级为有值信息,例如复制常量、某些线性传播或受限数值属性。它与指针包含分析也不能直接互换:解引用常把“指针可能到哪里”与“那里存了什么”组合起来,未必具有IDE要求的分配结构。
练习与解答
给过程摘要
再比较先合流再执行双变量加法与先逐路径执行。上述
参考资料
- Mooly Sagiv, Thomas Reps, Susan Horwitz, “Precise Interprocedural Dataflow Analysis with Applications to Constant Propagation”, Theoretical Computer Science 167, 1996, 131–170:IDE、copy-constant与linear-constant传播
- Anders Møller and Michael I. Schwartzbach, Static Program Analysis,2026年8月版,§9.3及§§9.5–9.6:函数标签、环境分配律与IDE复杂度条件