20

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

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

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 打印到控制台。

我已经尝试过使用默认的代码合同设置,但也尝试了一些无济于事的东西。我当前的设置如下所示:

在此处输入图像描述

任何想法我做错了什么?

更新:

这是构建窗口的结果。它似乎正在做某事,但只是发出警告而不是错误。在我观看的视频中,这些东西被标记为编译错误,程序甚至无法运行。

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 ==========
4

2 回答 2

13

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

首先,自构建 1.4.50327.0 以来,代码合同确实支持 Visual Studio 2012(Express 以外的任何版本),但devenv.exe /setup如果您的构建版本早于 1.4.50910.0,则必须运行。有关详细信息,请参阅发行说明

我遇到的第一个问题是在代码合同属性选项卡的“静态检查”部分中选中了“缓存结果”复选框。此选项默认开启,并且还需要 SQL Server CE 存储其缓存数据,Windows 8、VS2012 或 Code Contracts 未安装此选项。不幸的是,您的程序将继续正常编译,您必须手动挖掘 Build 输出以查看错误:

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

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

第二个问题是违反代码合同被视为警告,而不是编译错误。即使您启用了“将警告视为错误”,您的程序仍将继续编译并成功运行。如果您有一个较大的项目,其中包含大量您忽略的警告,则可能很难注意到这些新的代码合同警告。在我看到的演示视频中,这些警告也反映在 Visual Studio IDE 中(调用代码有一个蓝色下划线),但是我似乎在 Visual Studio 2012 中没有得到这种行为。

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

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

于 2012-11-17T22:43:52.183 回答
2

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

“完整”意味着将检查所有条件。其余的都是不言自明的。

  • 静态检查仅在后台运行,并检查它可以在您的代码中改进的任何内容。注意 - 它会稍微减慢您的构建速度。
于 2013-08-16T23:11:06.300 回答