Можно ли заставить анализ кода понимать кодовые контракты?

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

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

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

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

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


person Staffan Gustafsson    schedule 01.06.2010    source источник
comment
Я ожидаю, что вы могли бы написать надстройку FxCop для выполнения этой работы.   -  person GaTechThomas    schedule 08.06.2010
comment
У Терье Сандстрема есть отличная запись в блоге, которая отвечает на этот вопрос: вместе-или.aspx" rel="nofollow noreferrer">geekswithblogs.net/terje/archive/2010/10/14/   -  person Angerico Cariño    schedule 10.12.2010
comment
@Angerico Cariño Я обновил сообщение в блоге, упомянутое выше, добавив новую информацию об обходных путях решения этой проблемы.   -  person Terje Sandstrøm    schedule 20.02.2012
comment
@Dan: начиная с Framework V4.5.2 можно сообщить CodeAnalysis, как понимать CodeContracts. см. мой ответ в этом сообщении и в stackoverflow.com/ вопросы/13273842/   -  person Pieter Geerkens    schedule 09.08.2015


Ответы (3)


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

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

person JaredPar    schedule 01.06.2010
comment
Чтобы это действительно заработало, вам необходимо выполнить несколько задач: 1. Отключить CA1062 в анализе кода — 2. Включить выполнение проверки статического контракта на панели «Контракты кода» проекта. - 3. Включить неявные ненулевые обязательства – 4. Установите уровень предупреждения на высокий (важно, это то, чего мне не хватало!) - person Daniel Hilgarth; 08.11.2012
comment
Начиная с версии 4.5.2 платформы можно напрямую информировать анализ кода о принудительном выполнении контрактов кода. Проверьте мой ответ ниже. - person Pieter Geerkens; 26.07.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 {}

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

person Pieter Geerkens    schedule 26.07.2015
comment
Хотя это хорошее решение, оно не информирует анализ кода о контрактах кода. Это хитрый трюк, который перемещает все нарушения в одно место (метод ContractedNotNull) и подавляет предупреждение там. - person BartoszKP; 14.09.2015
comment
@BartoszKP: Хотя я понимаю вашу точку зрения, он все еще ходит и крякает, как утка; простите меня, если я назову это уткой. - person Pieter Geerkens; 15.09.2015

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

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

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

person Community    schedule 19.12.2010
comment
это работает с fxcop, а также с анализом кода (премиум и окончательный). - person ; 19.12.2010
comment
Это не работает с CA — при использовании набора правил «Microsoft All Rules» CA1062 по-прежнему выдается как предупреждение. VS 2010 sp1, кодовые контракты 1.4.40314.1 - person Jeff Ogata; 28.04.2011
comment
@felickz Это все еще вызывает CA1062 под VS2012 - person joshjeppson; 12.02.2013
comment
@BryanAnderson: начиная с версии 4.5.2 платформы можно напрямую информировать анализ кода о принудительном выполнении контрактов кода. Проверьте мой ответ выше. - person Pieter Geerkens; 19.08.2015