Automated tests 修改已更改对象上的子句错误

Automated tests 修改已更改对象上的子句错误,automated-tests,verification,solidity,dafny,Automated Tests,Verification,Solidity,Dafny,我如何声明(在Dafny中)“确保”方法返回的对象将是“新的”,也就是说,将不会与其他地方使用的对象相同(尚未) 以下代码显示了一个简单的示例: 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];

我如何声明(在Dafny中)“确保”方法返回的对象将是“新的”,也就是说,将不会与其他地方使用的对象相同(尚未)

以下代码显示了一个简单的示例:

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;
  }


}
方法newArray(a:array)返回(b:array)
需要一个无效的
b!=无效的
确保B
确保b.长度==a.长度+1
{
b:=新整数[a.长度+1];
}
类测试{
var检验:数组;
方法doesnowork()
需要此项。测试!=null
需要此.test.Length>10;
修改这个
{
this.test:=newArray(this.test);//用b更改数组a
this.test[3]:=9;//错误修改子句
}
方法doeswork()
需要此项。测试!=null
需要此.test.Length>10;
修改这个
{
this.test:=newint[this.test.Length+1];
这个。测试[3]:=9;
}
}
“doeswork”函数可以正确编译(和验证),但另一个函数不能正确编译(和验证),因为Dafny编译器无法知道“newArray”函数返回的对象是新的,即不需要在“Doesnowork”的“require”语句中列为可修改的函数,以使该函数满足只修改“this”的要求。在“doeswork”函数中,我简单地插入了“newArray”函数的定义,然后它就工作了

您可以在下面找到上面的示例,也可以在线运行


谢谢

您可以在
newArray
上说
确保新鲜(b)

fresh
的意思与您描述的完全相同:该对象与调用
newArray
之前分配的任何对象不同