修改已更改对象的子句错误

时间:2017-12-01 09:57:29

标签: automated-tests verification solidity dafny

我如何(在Dafny中)说明" 确保"保证方法返回的对象是" new",即与其他地方(尚未)使用的对象不一样?

以下代码显示了一个最小的示例:

method newArray(a:array<int>) returns (b:array<int>)
requires a != null
ensures b != null
ensures a != b
ensures b.Length == a.Length+1
{
  b := new int[a.Length+1];
}

class Testing {
  var test : array<int>;

  method doesnotwork()
  requires this.test!=null
  requires this.test.Length > 10;
  modifies this
  {
    this.test := newArray(this.test); //change array a with b
    this.test[3] := 9;  //error modifies clause
  }

  method doeswork()
  requires this.test!=null
  requires this.test.Length > 10;
  modifies this
  {
    this.test := new int[this.test.Length+1];
    this.test[3] := 9;
  }


}

&#34; 做工作&#34;函数正确编译(和验证),但另一个没有,因为Dafny编译器无法知道&#34; newArray &#34;返回的对象。功能是新的,即,不需要在&#34;要求&#34;中列出可修改的功能。 &#34; 的声明 &#34;函数,以便该函数满足它只修改&#34; 这个&#34;的要求。在&#34; 做工作&#34;函数,我只需插入&#34; newArray &#34;的定义功能,然后它工作。

您可以在https://rise4fun.com/Dafny/hHWwr下找到上面的示例,也可以在线运行。

谢谢!

1 个答案:

答案 0 :(得分:3)

您可以在ensures fresh(b)上说newArray

fresh表示您所描述的内容:该对象与调用newArray之前分配的任何对象不同。