前提条件中的数组范围

时间:2015-08-04 15:46:01

标签: verifiable-c

我目前正在尝试学习如何使用VST。我使用的是VST 1.5。我有这个小C程序( private void updateView(int index){ View v = yourListView.getChildAt(index - yourListView.getFirstVisiblePosition()); if(v == null) return; TextView someText = (TextView) v.findViewById(R.id.sometextview); someText.setText("Hi! I updated you manually!"); } ):

backref.c

我的Coq代码(具有微不足道的前后条件)是

char* rbr (char* out, int length, int dist) {
  while (length-- > 0) { out[0] = out[-dist]; out++; }
  return out;
}

作为前提条件,我想说Require Import floyd.proofauto. Require Import backref. Local Open Scope logic. Local Open Scope Z. Definition rbr_spec := DECLARE _rbr WITH sh : share, contents : Z -> int PRE [ _out OF (tptr tuchar), _length OF tint, _dist OF tint ] PROP () LOCAL () SEP () POST [tptr tuchar] local(fun _ => True). out[-dist]是可读的,out[-1]out[0]是可写的。 PLCC第210页告诉条件out[length-1],但它似乎在VST 1.5中不可用。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您可以使用array_at。 但是因为阵列的两个不同部分有所不同 所有权份额,你必须将它们描述为两种不同的 数组段。

类似的东西:

p: val  (* base address of array *)
v1: list val  (* contents of array segment 1 *)
v2: list val  (* contents of array segment 2 *)
sh: share (* readable *)
sh': share (* writable *)

SEP (`(array_at sh tint nil (-dist) (-1) v1 p);
     `(array_at sh' tint nil 0 (length-1) v2 p))

但它比这更复杂,因为这样就不见了 以下部分(-dist)及以上(length-1)的描述。

也许你不需要不同所有权的完整普遍性 分享您阵列的各个部分;你能想到为什么吗? 你的函数的客户端需要这个吗?在这种情况下, 只有一个数组段更容易,其值为"值" 是几个列表的串联。这在图中说明 示例progs / verif_revarray.v;特别注意 到该文件中的reverse_Inv。