20

私はコードコントラクトについて読んでいます。これは一見かなり革命的であるように見えますが、それらを機能させることができないようです。Windows8とVisualStudio2012 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;
   }
}

の最初のパラメータが0であるため、コンパイルが失敗することを期待していますAddが、プログラムは成功し、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 以降、Code ContractsVisual Studio 2012 (Express 以外のすべてのバージョン) をサポートしていますがdevenv.exe /setup、ビルドが 1.4.50910.0 より古い場合は実行する必要があります。詳細については、リリース ノートを参照してください。

私が抱えていた最初の問題は、[コード コントラクト] プロパティ タブの [静的チェック] セクションで [結果のキャッシュ] チェック ボックスがオンになっていることでした。このオプションは既定でオンになっており、Windows 8、VS2012、または Code Contracts によってインストールされないキャッシュ データを格納するために SQL Server CE も必要です。残念ながら、プログラムは問題なくコンパイルを続行し、エラーを確認するにはビルド出力を手動で掘り下げる必要があります。

CodeContracts: xxx: 未処理の例外: System.IO.FileNotFoundException: ファイルまたはアセンブリ 'System.Data.SqlServerCe, Version=3.5.1.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91' またはその依存関係の 1 つを読み込めませんでした。システムは、指定されたファイルを見つけることができません。

[結果をキャッシュ] チェックボックスをオフにすると、SQL Server CE をインストールする場合と同様に、この問題が修正されます。

2 つ目の問題は、Code Contract 違反が警告として扱われ、コンパイル エラーではないことです。「警告をエラーとして扱う」を有効にしても、プログラムは引き続きコンパイルされ、正常に実行されます。無視する大量の警告を含む大規模なプロジェクトがある場合、これらの新しいコード コントラクトの警告に気付くのが難しい可能性があります。私が見たデモ ビデオでは、これらの警告は Visual Studio IDE にも反映されていました (呼び出し元のコードには青い下線が引かれていました) が、Visual Studio 2012 ではこの動作が得られないようです。

この設計上の決定は私を悩ませます。コード内で関数が 0 より大きい整数を取る必要があるというコントラクトを定義し、あからさまに 0 を渡すと、これはエラーになります。警告ではありません。私はその契約を単純明快に破りました。

全体として、Code Contracts は非常に強力であり、ソフトウェアのテスト方法を変える可能性があると思います。MS Research は間違いなく素晴らしい仕事をしました。ただし、まだメインストリームの準備ができているとは思いません。機能させるには微調整が必​​要であり、Visual Studio のビルド プロセスにシームレスに統合されず、かなり遅いです。小規模なプロジェクトでは期待どおりに機能しましたが、大規模なプロジェクトにプラグインすると、すべてのコードを分析するのに 10 分ほどかかりました。

于 2012-11-17T22:43:52.183 に答える