Можно ли заставить Code Analysis понимать Code Contracts? - PullRequest
21 голосов
/ 01 июня 2010

При использовании анализа кода и кодовых контрактов в сочетании я получаю много предупреждений, таких как

CA1062 : Microsoft.Design: во внешне видимом методе «Foo.Bar (Log)» проверьте параметр «log» перед его использованием.

В Foo.Bar у меня есть контракт, который подтверждает log.

public Bar(Log log)
{
   Contract.Requires(log != null);
   log.Lines.Add(...);
   // ...
}

Есть ли способ заставить FxCop понимать контракты кода?

Ответы [ 3 ]

14 голосов
/ 01 июня 2010

Нет, я не думаю, что это возможно в текущей сборке, поскольку код, сгенерированный переписчиком контрактов, не создает стандартный шаблон, который ищет FxCop.

Обычно я отключаю это конкретное правило FxCop при использовании контрактов кода. Я считаю, что статический верификатор более чем компенсирует потерю этого правила, поскольку он будет кричать об отсутствии проверки гораздо более агрессивно, чем FxCop. Я бы предложил такой же подход, который решит эту проблему для вас.

3 голосов
/ 26 июля 2015

Да, , как отмечено в моем ответе здесь , начиная с версии 4.5.2 платформы (возможно, 4.5), можно сообщить об анализе кода о действующих контрактах кода. Метод расширения и класс атрибута маркера должны быть определены следующим образом:

  public static class ContractExtensions {
    /// <summary>Throws <c>ContractException{name}</c> if <c>value</c> is null.</summary>
    /// <param name="value">Value to be tested.</param>
    /// <param name="name">Name of the parameter being tested, for use in the exception thrown.</param>
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "value")]
    [SuppressMessage("Microsoft.Usage", "CA1801:ReviewUnusedParameters", MessageId = "name")]
    [ContractAbbreviator] // Requires Assemble Mode = Standard Contract Requires
    public static void ContractedNotNull<T>([ValidatedNotNull]this T value, string name) where T : class {
      Contract.Requires(value != null,name);
    }
  }

/// <summary>Decorator for an incoming parameter that is contractually enforced as NotNull.</summary>
[AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)]
public sealed class ValidatedNotNullAttribute : global::System.Attribute {}

Дополнительные подробности есть в моем другом ответе.

0 голосов
/ 19 декабря 2010

Укажите исключение ArgumentNullException следующим образом:

public Bar(Log log)
{
   Contract.Requires<ArgumentNullException>(log != null);
   log.Lines.Add(...);
   // ...
}

Fxcop ожидает выброса исключения ArgumentNullException ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...