Domanda Uno può fare l'analisi del codice per capire i contratti di codice?


Quando uso l'analisi del codice e i contratti di codice in combinazione, ricevo un sacco di avvertimenti come

CA1062: Microsoft.Design: nel metodo esternamente visibile 'Foo.Bar (Log)', convalida il parametro 'log' prima di utilizzarlo.

In Foo.Bar, ho un contratto che convalida log.

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

C'è un modo per far capire a FxCop i contratti di codice?


21
2018-06-01 13:22


origine


risposte:


No, non credo sia possibile nella build corrente, poiché il codice generato dal repressore dei contratti non produce il modello standard che FxCop sta cercando.

In genere, tuttavia, disabilito questa particolare regola FxCop quando utilizzo i contratti di codice. Trovo che il verificatore statico più che compensa la perdita di questa regola in quanto urlerà di una mancanza di controllo molto più aggressivo di FxCop. Vorrei suggerire lo stesso approccio qui che risolverà questo problema per voi.


14
2018-06-01 14:53



Sì, come notato nella mia risposta qui, a partire dalla versione 4.5.2 del framework (eventualmente 4.5) è possibile informare l'analisi del codice dei Contratti di Codice che vengono applicati. Un metodo di estensione e una classe di attributo marker devono essere definiti in questo modo:

  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 {}

Ulteriori dettagli sono nella mia altra risposta.


3
2017-07-26 15:54



Specificare l'eccezione ArgumentNullException in questo modo:

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

Fxcop si aspetta di lanciare l'eccezione ArgumentNullException ...


-2
2017-12-19 13:07