我正在阅读关于针对C程序的高效上下文敏感指针分析的论文的Strong Update部分,但我无法准确掌握其含义。有人可以提供一个例子,尤其是链接中的这一行:
这极大地提高了我们执行强大更新的能力。由于堆块表示在特定上下文中分配的所有存储,因此我们假设本地分配的堆块永远不会是唯一的。
答案 0 :(得分:4)
在静态分析的上下文中,当一个人试图一次推断出程序的所有可能行为时,强更新是一个更新(赋值)操作,其中更新的地址是已知的精确。相比之下,写入的地址未准确知道的分配称为弱更新。
当处理弱更新时,不仅可以在多个位置写入新值而且不知道哪个,但此外,必须考虑每个位置保持其旧值的可能性(因为更新可能在其他地方发生) )。
考虑Frama-C's value analysis,这是对大多数Linux发行版中作为包提供的C程序的有效上下文敏感指针分析。我们假设我们正在分析以下程序:
int a, b, c, d, *p, t[5];
int main(int argc, char **argv){
a = 1; // strong
p = &b;
*p = 2; // strong
if (c & 1)
p = &c;
else
p = &d;
*p = 3; // weak
t[2] = 4; // strong
t[c & 2] = 5; // weak
}
使用Frama-C的价值分析分析这个例子时,得到:
$ frama-c -val t.c
[value] Values at end of function main:
a ∈ {1}
b ∈ {2}
c ∈ {0; 3}
d ∈ {0; 3}
p ∈ {{ &c ; &d }}
t[0] ∈ {0; 5}
[1] ∈ {0}
[2] ∈ {4; 5}
[3..4] ∈ {0}
__retres ∈ {0}
位置c
,d
,t[0]
和t[2]
已成为弱更新的目标。它们每个都可以包含一个新值(可以写在那里)或一个旧值(当时存在并可能保留)。
通过反对,a
和b
成为强烈更新的对象。众所周知,赋值正在写入这些变量中的每一个,因此没有必要考虑它们可能保留旧值的可能性。
关于您引用的确切段落:
关键是要认识到表示的扩展参数 即使这样,唯一指针的初始值也可以是唯一的块 指针在调用上下文中有许多可能的值。自从 指针在任何时候都只能包含其中一种可能性, 扩展参数是范围内的唯一块 程序。仅当多个位置指向扩展时 参数和该参数的实际值不是单一的 唯一的位置我们必须将参数标记为不唯一。这很大 提高我们执行强大更新的能力。
研究人员的目标是尽可能经常使用强更新,因为它更精确。在本段中,他们指出虽然指针p
可能指向多个可能的位置,但如果您为“位置p
指向”提供名称,则可以强烈更新该位置。我认为这就是他们所说的。
在我的示例程序中,这将允许在程序结束时从*p
读取并发现它包含3
,尽管p
指向{{1}可能包含c
或0
或3
的{}可能包含d
或0
。旧版本的Frama-C的价值分析使用类似于描述的技术推断出这些信息(如果我理解正确的话),但它太昂贵而且被删除了。