以下是我创建的示例,以使静态分析工具失败:
using System.Diagnostics.Contracts;
using System;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
object x = null;
Contract.Assert(x != null);
}
}
}
运行时分析会抛出正确的异常,但静态分析甚至不会发出警告。我在项目设置中选中了每个复选框,并在“hi”上选择了警告级别。我正在运行1.4.51019.0版本。
我需要做些什么才能让编译失败?
答案 0 :(得分:3)
“选中的每个复选框”都是此处的问题。您需要取消选中“推断确保”。
这里发生的是以下内容:
您创建的代码永远不会是正确的,您使用x
初始化null
,然后直接断言x
不应该null
。
由于这种矛盾,代码合同推断Contract.Ensures(false)
,这将永远失败
我假设方法开头的impred Contract.Ensures(false)
将使静态分析器跳过方法的其余部分。
推断Contract.Ensures(false)
对我来说似乎是代码合同的错误,但禁用它的唯一方法是禁用完全确定的推断。