代码合同似乎不适用于VS2012

时间:2012-11-17 20:56:01

标签: c# .net visual-studio-2012 code-contracts

我正在阅读代码合同,乍一看似乎是相当革命性的,但我似乎无法让它们发挥作用。我正在运行Windows 8和Visual Studio 2012 Premium(两者的发行版本)。然后,我通过单击“下载代码合同”链接从here安装了代码合同。

然后我在一个全新的控制台应用程序中编写了以下代码:

class Program
{
   static void Main(string[] args)
   {
      var answer = Add(0, 5);
      Console.Write(answer);

      Console.ReadLine();
   }

   static int Add(int x, int y)
   {
      Contract.Requires(x > 0 && y > 0);

      return x + y;
   }
}

我希望编译失败,因为Add的第一个参数是0,但程序成功并将5输出到控制台。

我已尝试使用默认的代码合约设置,并且还使用了一些东西,但无济于事。我目前的设置如下:

enter image description here

任何想法我做错了什么?

更新

以下是Build窗口的结果。看起来它正在做某事,但只是提出警告而不是错误。在我观看的视频中,这些内容被标记为编译错误,程序甚至无法运行。

1>------ Build started: Project: DeleteMe, Configuration: Debug Any CPU ------
1>  DeleteMe -> c:\users\mike\documents\visual studio 2012\Projects\DeleteMe\DeleteMe\bin\Debug\DeleteMe.exe
1>  CodeContracts: Task manager is unavailable.
1>  CodeContracts: DeleteMe: Run static contract analysis.
1>  CodeContracts: Suggested requires: Contract.Requires(false);
1>  CodeContracts: DeleteMe: Validated:  0.0 %
1>  CodeContracts: DeleteMe: Contract density: 0.87
1>  CodeContracts: DeleteMe: Total methods analyzed 4
1>  CodeContracts: DeleteMe: Methods with 0 warnings 3
1>  CodeContracts: DeleteMe: Total time 4.974sec. 1243ms/method
1>  CodeContracts: DeleteMe: Methods with necessary preconditions: 1
1>  CodeContracts: DeleteMe: Discovered 1 new candidate preconditions in 00:00:00.1718843
1>  CodeContracts: DeleteMe: Retained 1 preconditions after filtering
1>  CodeContracts: DeleteMe: Inferred 0 object invariants
1>  CodeContracts: DeleteMe: Retained 0 object invariants after filtering
1>  CodeContracts: DeleteMe: Detected 0 code fixes
1>  CodeContracts: DeleteMe: Proof obligations with a code fix: 0
1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(14,10,14,33): warning : CodeContracts: requires is false: x > 0 && y > 0
1>c:\Users\Mike\Documents\Visual Studio 2012\Projects\DeleteMe\DeleteMe\Program.cs(22,10,22,44): warning : CodeContracts: location related to previous warning
1>  CodeContracts: Checked 1 assertion: 1 false
1>  CodeContracts: DeleteMe: 
1>  CodeContracts: DeleteMe: Static contract analysis done.
========== Build: 1 succeeded, 0 failed, 0 up-to-date, 0 skipped ==========

2 个答案:

答案 0 :(得分:13)

所以,问题似乎是几个限制和陷阱与代码合同的组合。希望这个答案能帮助像我这样的人刚开始。

首先,代码合同 支持Visual Studio 2012(Express以外的任何版本),因为版本1.4.50327.0,但如果您的版本低于1.4,则必须运行devenv.exe /setup .50910.0。有关详细信息,请参阅Release Notes

我遇到的第一个问题是在“代码合同”属性选项卡的“静态检查”部分中选中了“缓存结果”复选框。默认情况下,此选项处于启用状态,并且还要求SQL Server CE存储其缓存数据,而Windows 8,VS2012或Code Contracts不会安装该数据。不幸的是,你的程序将继续编译得很好,你必须手动浏览Build输出才能看到错误:

  

CodeContracts:xxx:未处理的异常:   System.IO.FileNotFoundException:无法加载文件或程序集   'System.Data.SqlServerCe,Version = 3.5.1.0,Culture = neutral,   PublicKeyToken = 89845dcd8080cc91'或其依赖项之一。该   系统找不到指定的文件。

取消选中“缓存结果”复选框将解决此问题,就像安装SQL Server CE一样。

第二个问题是违反代码合同的行为被视为warnings, and not compile errors。即使您启用了“将警告视为错误”,您的程序也将继续编译并成功运行。如果您有一个较大的项目,您忽略了大量的警告,则可能很难注意到这些新的“代码合同”警告。在demo video I saw中,这些警告也反映在Visual Studio IDE中(调用代码有一个蓝色下划线),但我似乎没有在Visual Studio 2012中获得此行为。

这个设计决定让我感到不安。如果我在我的代码中定义一个契约,那么一个函数必须取一个大于0的整数,并且我公然传入一个0,这是一个错误。不是警告。我打破了那份简单而简单的合同。

总的来说,我认为Code Contracts非常强大,可能会改变我们测试软件的方式。 MS Research绝对做得很棒。但是,我认为它还没有为主流做好准备。它需要一些调整才能工作,它不能无缝集成到Visual Studio构建过程中,而且它也很慢。在较小的项目中,它按预期工作,但当我将其插入更大的项目时,分析所有代码花了十分钟。

答案 1 :(得分:2)

先生,您必须启用运行时检查。在您的窗口中,您发布为图像。

“完整”将表示将检查所有条件。 其余的都是自我解释的。

  • 静态检查仅在后台运行,并检查代码中可以改进的任何内容。注意 - 它会减慢你的构建速度。