使用工厂模式时,Dafny调用可能会违反上下文的Modifys子句

时间:2019-08-27 16:29:52

标签: dafny

当调用修改类中字段的方法时,如果类是使用工厂创建的,则会收到错误消息:

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();时,验证者不会抱怨。

1 个答案:

答案 0 :(得分:0)

CounterFactory()需要一个后置条件才能显示返回的对象是新对象。工作方法如下:

method CounterFactory() returns (r: Counter)
    ensures fresh(r)
{
    r := new Counter();
}