代码契约:静态方法中不遵守不变量

时间:2016-10-18 22:11:36

标签: c# static-analysis code-contracts

我读到了类似的问题:

但仍然令我感到困惑的是,这个最小的例子无法被静态证明:

public class Example
{
    private const string s = "123";

    public int A { get; }

    [ContractInvariantMethod]
    private void ObjectInvariant()
    {
        Contract.Invariant(A >= 0);
        Contract.Invariant(A < 3);
    }

    public Example(int a)
    {
        Contract.Requires(a >= 0);
        Contract.Requires(a < 3);

        this.A = a;
    }

    public static char Test(Example x)
    {
        Contract.Requires(x != null);
        return s[x.A];
    }
}

它给了我以下警告:

CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(0 <= x.A); for parameter validation
CodeContracts: Missing precondition in an externally visible method. Consider adding Contract.Requires(x.A < 3); for parameter validation

我尝试了很多方法来实现readonly属性,包括(显式支持字段+属性获取),如其中一个答案中所建议的那样,但都没有。

这是一个根本性的交易破坏者,使我无法利用代码合同的静态验证优势。

我想知道为什么这不起作用?我怎样才能使它发挥作用?

1 个答案:

答案 0 :(得分:0)

这个明确的支持字段+属性对我有用。您还需要确保物业获得。

    public class Example
{
    private const string S = "123";
    readonly int a;

    public int A
    {
        get
        {
            Contract.Ensures(Contract.Result<int>() < 3);
            Contract.Ensures(Contract.Result<int>() >= 0);

            return a;
        }
    }

    [ContractInvariantMethod]
    private void ObjectInvariant()
    {
        Contract.Invariant(a >= 0);
        Contract.Invariant(a < 3);
    }

    public Example(int a)
    {
        Contract.Requires(a >= 0);
        Contract.Requires(a < 3);

        this.a = a;
    }

    public static char Test(Example x)
    {
        Contract.Requires(x != null);
        return S[x.A];
    }
}