代码合同静态检查似乎不起作用

时间:2014-03-21 12:54:46

标签: c# visual-studio-2010 static-analysis code-contracts

我正在使用VS 2010并测试一些真正基本的东西:

class Program
{
    static void Main(string[] args)
    {
        var numbers = new int[2];
        numbers[3] = 0;
    }
}

我去了物业>代码合同并启用了静态检查。编译/构建时没有出现错误/警告/波浪线下划线。

enter image description here

修改

当警告级别变为最大值时,我会收到此警告,这不是我之后发出的警告:

警告1 CodeContracts:调用方法'Main'将始终导致错误。如果需要,请考虑添加Contract.Requires(false)来记录

2 个答案:

答案 0 :(得分:2)

不清楚你期待的是什么警告(你声明"我收到了这个警告,这不是我之后发出的警告"没有实际说出你警告的警告 之后),但也许这会有所帮助。

首先:

var numbers = new int[2];
numbers[3] = 0;

这是一个在运行时失败的越界访问。这是您获得的错误的原因,其中指出"调用方法' Main'总会导致错误。" - 这完全准确,它总是会导致错误,因为越界数组访问将始终抛出运行时异常。

既然你声明这不是你所期待的警告,但是,我必须对你期待的东西采取一些猜测。我最好的猜测是,由于勾选了隐含的非空义务'复选框,并尝试将Contract.Requires(args!= null)添加到您的代码中,您希望得到一个警告,可能会使用null参数调用您的Main方法。

问题是,Code Contracts 只会检查您自己的代码,以确保在调用Main时始终提供非null参数。问题是,你从不打电话给Main - 操作系统将调用Main,而Code Contracts不会检查操作系统的代码!

无法提供对Main提供的参数的编译时检查 - 您必须在运行时手动检查这些参数。同样,代码约定的工作方式是检查您对函数调用的调用是否符合您设置的要求 - 如果您自己实际上没有自己进行调用,则Code Contracts在编译时没有编译。物质

答案 1 :(得分:0)

我试过这个(尽管使用Visual Studio 2013 + Code Contracts),我发现了以下内容:

  • 警告级别设置为“低”(就像你一样),我没有收到警告。
  • 警告级别设为“hi”时, 会收到警告。

所以我建议增加警告级别滑块。