C 有人能解释什么是强更新,并举例说明吗?
我正在读一篇关于C程序高效上下文敏感指针分析的文章,但我无法准确理解它的含义。是否有人可以提供一个例子,尤其是链接中的这一行: 这大大提高了我们执行强大更新的能力。由于堆块表示在特定上下文中分配的所有存储,因此我们假设本地分配的堆块从来都不是唯一的 强更新,弱更新 在静态分析的上下文中,当一个人试图一次推断出程序的所有可能行为时,强更新是一种更新(赋值)操作,其中被更新的地址是精确已知的。相比之下,写入地址不确切的赋值称为弱更新 处理弱更新时,不仅可以在多个位置写入新值,而且不知道写入哪个位置,而且必须考虑每个位置保留其旧值的可能性(因为更新可能发生在其他位置) 例子 考虑一下,在大多数Linux发行版中,C程序的高效上下文敏感指针分析作为一个包提供。假设我们正在分析以下程序:C 有人能解释什么是强更新,并举例说明吗?,c,pointers,heap,variable-assignment,C,Pointers,Heap,Variable Assignment,我正在读一篇关于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
指向可能包含0
或3
的c
,或者指向可能包含0
或3
的d
。Frama-C的价值分析的旧版本使用类似于所述的技术(如果我理解正确的话)推断出该信息,但它太昂贵,因此被删除