当调用修改类中字段的方法时,如果类是使用工厂创建的,则会收到错误消息:
class Counter {
var i: int;
constructor() {
i := 0;
}
method Count()
modifies this
{
i := i + 1;
}
}
method CounterFactory() returns (r: Counter)
{
r := new Counter();
}
method Main() {
var counter := CounterFactory();
counter.Count(); // <~~ Error: call may violate context's modifies clause
}
当我将错误正上方的行替换为var counter := new Counter();
时,验证者不会抱怨。
答案 0 :(得分:0)
CounterFactory()
需要一个后置条件才能显示返回的对象是新对象。工作方法如下:
method CounterFactory() returns (r: Counter)
ensures fresh(r)
{
r := new Counter();
}