C 有人能解释什么是强更新,并举例说明吗?

C 有人能解释什么是强更新,并举例说明吗?,c,pointers,heap,variable-assignment,C,Pointers,Heap,Variable Assignment,我正在读一篇关于C程序高效上下文敏感指针分析的文章,但我无法准确理解它的含义。是否有人可以提供一个例子,尤其是链接中的这一行: 这大大提高了我们执行强大更新的能力。由于堆块表示在特定上下文中分配的所有存储,因此我们假设本地分配的堆块从来都不是唯一的 强更新,弱更新 在静态分析的上下文中,当一个人试图一次推断出程序的所有可能行为时,强更新是一种更新(赋值)操作,其中被更新的地址是精确已知的。相比之下,写入地址不确切的赋值称为弱更新 处理弱更新时,不仅可以在多个位置写入新值,而且不知道写入哪个位置,

我正在读一篇关于C程序高效上下文敏感指针分析的文章,但我无法准确理解它的含义。是否有人可以提供一个例子,尤其是链接中的这一行:

这大大提高了我们执行强大更新的能力。由于堆块表示在特定上下文中分配的所有存储,因此我们假设本地分配的堆块从来都不是唯一的

强更新,弱更新 在静态分析的上下文中,当一个人试图一次推断出程序的所有可能行为时,强更新是一种更新(赋值)操作,其中被更新的地址是精确已知的。相比之下,写入地址不确切的赋值称为弱更新

处理弱更新时,不仅可以在多个位置写入新值,而且不知道写入哪个位置,而且必须考虑每个位置保留其旧值的可能性(因为更新可能发生在其他位置)

例子 考虑一下,在大多数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
指向可能包含
0
3
c
,或者指向可能包含
0
3
d
。Frama-C的价值分析的旧版本使用类似于所述的技术(如果我理解正确的话)推断出该信息,但它太昂贵,因此被删除