有人可以解释什么是强大的更新,并给出一个说明它的例子?

时间:2012-11-02 16:29:04

标签: c pointers heap variable-assignment

我正在阅读关于针对C程序的高效上下文敏感指针分析的论文的Strong Update部分,但我无法准确掌握其含义。有人可以提供一个例子,尤其是链接中的这一行:

  

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

1 个答案:

答案 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}

位置cdt[0]t[2]已成为弱更新的目标。它们每个都可以包含一个新值(可以写在那里)或一个旧值(当时存在并可能保留)。

通过反对,ab成为强烈更新的对象。众所周知,赋值正在写入这些变量中的每一个,因此没有必要考虑它们可能保留旧值的可能性。

在文章的上下文中

关于您引用的确切段落:

  

关键是要认识到表示的扩展参数   即使这样,唯一指针的初始值也可以是唯一的块   指针在调用上下文中有许多可能的值。自从   指针在任何时候都只能包含其中一种可能性,   扩展参数是范围内的唯一块   程序。仅当多个位置指向扩展时   参数和该参数的实际值不是单一的   唯一的位置我们必须将参数标记为不唯一。这很大   提高我们执行强大更新的能力。

研究人员的目标是尽可能经常使用强更新,因为它更精确。在本段中,他们指出虽然指针p可能指向多个可能的位置,但如果您为“位置p指向”提供名称,则可以强烈更新该位置。我认为这就是他们所说的。

在我的示例程序中,这将允许在程序结束时从*p读取并发现它包含3,尽管p指向{{1}可能包含c03的{​​}可能包含d0。旧版本的Frama-C的价值分析使用类似于描述的技术推断出这些信息(如果我理解正确的话),但它太昂贵而且被删除了。