代码合同静态检查似乎没有工作

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

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

我去了属性>代码合同,并启用了静态检查。 在编译/编译时没有显示错误/警告/下划线。

在这里输入图像描述

编辑:

当把警告级别设置为最大时,我得到这个警告,这不是我之后的警告:

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


目前还不清楚你期望的是什么警告(你说“我得到这个警告,这不是我之后的警告”,而没有实际说出你之后的警告),但也许这会有所帮助。

第一:

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

这是一个在运行时会失败的越界访问。 这是你得到的错误的原因,其中指出“调用方法'主'将始终导致错误。” - 这是非常准确的,它总是会导致错误,因为超出界限的数组访问总是会引发运行时异常。

既然你声明这不是你所期待的警告,但是,我不得不对你所期望的做出一些猜测。 我最好的猜测是,由于勾选了“隐式非空义务”复选框,并且尝试向代码中添加Contract.Requires(args!= null),所以您期望得到一个警告,提示您的Main方法可能可能会被一个空参数调用。

事情是,Code Contracts只会检查你自己的代码,以确保你在调用Main时总是提供一个非空的参数。 事情是, 你永远不会打电话给Main - 操作系统会调用Main,而Code Contracts不会检查操作系统的代码!

没有办法为提供给Main的参数提供编译时检查 - 您必须在运行时手动检查这些参数。 再次,Code Contracts通过检查你对一个函数的调用是否符合你设置的要求来工作 - 如果你自己没有真正地进行调用,Code Contracts在这个问题上没有编译时间。


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

  • 将警告级别设置为“低”(就像您一样),我不会收到警告。
  • 警告级别设置为“嗨”,我确实收到警告。
  • 所以我建议增加你的警告级别滑块。

    链接地址: http://www.djcxy.com/p/23743.html

    上一篇: Code contracts static checking does not seem to be working

    下一篇: Can code contracts replace parameter validation?