Подтвердить что ты не робот

Кодовые контракты, похоже, не работают на 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 на консоль.

Я пробовал с настройками кода Контракта по умолчанию, а также сбрасывал вещи немного бесполезно. Мои текущие настройки выглядят следующим образом:

enter image description here

Любые идеи, что я делаю неправильно?

UPDATE:

Здесь результаты из окна сборки. Кажется, что он что-то делает, а просто предупреждает об ошибках. В видео, которое я смотрел, эти вещи были отмечены как ошибки компиляции, и программа даже не запускалась.

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

Ответ 1

Таким образом, проблема представляла собой комбинацию нескольких ограничений и gotchas с кодовыми контрактами. Надеюсь, этот ответ поможет людям, как я, только начинать.

Во-первых, Code Contracts поддерживает Visual Studio 2012 (любая версия, отличная от Express) с момента сборки 1.4.50327.0, хотя вам нужно запустить devenv.exe /setup, если ваша сборка старше 1.4.50910.0. Подробнее см. Примечания к выпуску.

Первая проблема, с которой я столкнулась, заключалась в том, что флажок "Кэш-результаты" был отмечен в разделе "Статическая проверка" на вкладке свойств кода контракта. Этот параметр включен по умолчанию, а также SQL Server CE для хранения кэшированных данных, которые не установлены в Windows 8, VS2012 или Code Contracts. К сожалению, ваша программа будет продолжать компилироваться просто отлично, и вам придется вручную перебирать результат сборки, чтобы увидеть ошибку:

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 (код вызова имел синюю подчеркивание), однако я не знаю, t похоже, что это поведение в Visual Studio 2012.

Это дизайнерское решение меня беспокоит. Если я определяю контракт в своем коде, что функция должна принимать целое число больше 0, и я откровенно передаю в 0, это ошибка. Не предупреждение. Я нарушил этот контракт, простой и простой.

В целом, я бы сказал, что Code Contracts чрезвычайно эффективен и может потенциально изменить способ тестирования программного обеспечения. MS Research определенно проделала отличную работу. Тем не менее, я не думаю, что он действительно готов к мейнстриму. Требуется некоторое улучшение для работы, оно не интегрируется в процесс сборки Visual Studio, а также довольно медленно. На небольших проектах он работал так, как ожидалось, но когда я подключил его к более крупному проекту, для анализа всего кода потребовалось десять минут.

Ответ 2

Сэр, вам нужно будет включить проверку времени выполнения. Под вашим окном вы разместили изображение.

"Полный" будет означать, что все условия будут проверены. Остальные самоочевидны.

  • Статическая проверка выполняется только в фоновом режиме и проверяет все, что может улучшить внутри вашего кода. Осторожно - это немного замедляет ваши сборки.