.net 这是静态合同检查器中的错误吗?

.net 这是静态合同检查器中的错误吗?,.net,code-contracts,.net,Code Contracts,如果我这样写: public sealed class Foo { private int count; private object owner; private void Bar() { Contract.Requires(count > 0); Contract.Ensures(owner == null || count > 0); if (count == 1) own

如果我这样写:

public sealed class Foo
{
    private int count;
    private object owner;
    private void Bar()
    {
        Contract.Requires(count > 0);
        Contract.Ensures(owner == null || count > 0);

        if (count == 1)
            owner = null;
        --count;
    }
}
静态契约检查器可以证明所有断言

但如果我写这封信:

public sealed class Foo
{
    private int count;
    private object owner;
    private void Bar()
    {
        Contract.Requires(count > 0);
        Contract.Ensures(owner == null || count > 0);

        --count;
        if (count == 0)
            owner = null;
    }
}
它声称后条件
owner==null | | count>0
未经验证

我想我可以证明第二种形式没有违反这一后置条件:

// { count > 0 } it's required
--count;
// { count == 0 || count > 0 } if it was 1, it's now zero, otherwise it's still greater than zero
if (count == 0)
{
    // { count == 0 } the if condition is true
    owner = null;
    // { count == 0 && owner == null } assignment works
}
// { count == 0 && owner == null || count != 0 && count > 0 } either the if was entered or not
// { owner == null || count > 0 } we can assume a weaker postcondition
--count;
Contract.Assert(count == 0 || count > 0)
if (count == 0)
    owner = null;
我的证据有问题吗

我在我的证明中添加了断言作为
Contract.Assert
对代码的调用,我得出的结论是,如果我只添加这一个,它就能够证明后条件:

// { count > 0 } it's required
--count;
// { count == 0 || count > 0 } if it was 1, it's now zero, otherwise it's still greater than zero
if (count == 0)
{
    // { count == 0 } the if condition is true
    owner = null;
    // { count == 0 && owner == null } assignment works
}
// { count == 0 && owner == null || count != 0 && count > 0 } either the if was entered or not
// { owner == null || count > 0 } we can assume a weaker postcondition
--count;
Contract.Assert(count == 0 || count > 0)
if (count == 0)
    owner = null;
但是,如果我现在将同样的断言改为“更自然”的方式,它就会失败:

--count;
Contract.Assert(count >= 0)
if (count == 0)
    owner = null;
这两个断言应该是等价的,但是静态检查器对它们的处理不同

(顺便说一下,我正在使用VS10的beta 2)

警告:我对.net合同系统的细节一无所知

然而,我可以告诉你:要为这个系统支持的断言生成一个完整的验证程序是不可能的(参见停止问题)

那么:这是一个bug吗?没有


另一方面,似乎有理由认为这可能是验证程序的实现者希望添加到其系统中的常见情况。

我不希望这个高度复杂的验证程序处于完全工作状态,因为它毕竟只是测试版。我认为这是一个bug,或者至少是一个值得向开发人员提出的问题,因为这是一个自动进行静态检查的非常简单的事情

无论如何,从外观上看,assures标记只是用来说明静态契约检查器是否能够确保条件。这并不意味着这个条件是无效的,它只是意味着它找不到证据


我更担心的是,如果它说某样东西被确定是无效的。那算是一只虫子

既然到目前为止还没有人证明我错了,我就把它当作一个bug并提交一份报告。现在,我在哪里可以做到?谷歌救援…连接似乎恨我,或我的连接,或铬。如果有人能帮我报告这个错误,我将不胜感激……我知道停止的问题。但这个特殊的问题是可以证明的(我就是这么做的)。验证人对待
a>=b
不同于
a==b | a>b
这一事实难道不是一个错误吗?不。更具体地说:在某些特定系统中可以证明的东西和真实的东西之间肯定存在差距。因此,重要的问题是您的证明是否符合与.NET合同相关的证明系统。可能是这样,但一般来说,如果发现它不存在,那就不会是一个bug,除非.NET检查程序向您做出具体承诺,保证找到什么样的证明。好吧,我从一般意义上理解您的观点。然而,我认为
a>=b
a==b | | a>b
之间的等价性在这样一个系统中是预期的(也是合理的)行为(同时
a
b
都是纯的,这是.NET检查器所需要的)。未能遵守预期行为是我书中的一个错误。它处理
a>=b
a==b | a>b
的事实是什么?有什么原因吗?我的意思是,区别对待这些。