簡體   English   中英

代碼合同似乎不適用於VS2012

[英]Code Contracts doesn't seem to work on VS2012

我正在閱讀代碼契約,乍一看似乎是相當革命性的,但我似乎無法讓它們發揮作用。 我正在運行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。

我已嘗試使用默認的代碼合約設置,並且還使用了一些東西而無濟於事。 我目前的設置如下:

在此輸入圖像描述

我有什么想法我做錯了嗎?

更新:

這是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 ==========

因此,這個問題似乎是代碼合約的一些限制和陷阱的組合。 希望這個答案能幫助像我這樣的人剛開始。

首先,代碼合同確實支持Visual Studio 2012(除了Express之外的任何版本),因為你的構建版本早於1.4.50910.0,你必須運行devenv.exe /setup 有關更多信息,請參閱發行說明

我遇到的第一個問題是在“代碼約定”屬性選項卡的“靜態檢查”部分中選中了“緩存結果”復選框。 默認情況下,此選項處於啟用狀態,並且還要求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一樣。

第二個問題是Code Contract違規被視為警告,而不是編譯錯誤 即使您啟用了“將警告視為錯誤”,您的程序也將繼續編譯並成功運行。 如果您有一個較大的項目,您忽略了大量的警告,則可能很難注意到這些新的“代碼合同”警告。 我看到演示視頻中 ,這些警告也反映在Visual Studio IDE中(調用代碼有一個藍色下划線),但我似乎沒有在Visual Studio 2012中獲得此行為。

這個設計決定讓我感到不安。 如果我在我的代碼中定義一個契約,那么一個函數必須取一個大於0的整數,並且我公然傳入一個0,這是一個錯誤。 不是警告。 我打破了那份簡單而簡單的合同。

總的來說,我認為Code Contracts非常強大,可能會改變我們測試軟件的方式。 MS Research絕對做得很棒。 但是,我認為它還沒有為主流做好准備。 它需要一些調整才能正常工作,它無法無縫集成到Visual Studio構建過程中,而且速度也很慢。 在較小的項目中,它按預期工作,但當我將其插入更大的項目時,花了十分鍾時間來分析所有代碼。

先生,您必須啟用運行時檢查。 在您的窗口中,您發布為圖像。

“完整”將意味着將檢查所有條件。 其余的都是自我解釋的。

  • 靜態檢查僅在后台運行,並檢查代碼中可以改進的任何內容。 注意 - 它會減慢你的構建速度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM