c# - sonar - ¿Se puede hacer que el análisis de código entienda los contratos de código?
software sonar (3)
Al usar el Análisis de código y los Contratos de código en combinación, recibo muchas advertencias como
CA1062 : Microsoft.Design: en el método ''Foo.Bar (Log)'' visible externamente, valide el parámetro ''log'' antes de usarlo.
En Foo.Bar, tengo un contrato que valida el log
.
public Bar(Log log)
{
Contract.Requires(log != null);
log.Lines.Add(...);
// ...
}
¿Hay alguna manera de hacer que FxCop entienda los contratos de código?
Especifique la excepción ArgumentNullException de esta manera:
public Bar(Log log)
{
Contract.Requires<ArgumentNullException>(log != null);
log.Lines.Add(...);
// ...
}
Fxcop espera lanzar la excepción ArgumentNullException ...
No, no creo que sea posible en la compilación actual ya que el código generado por el redactor de contratos no produce el patrón estándar que FxCop está buscando.
Por lo general, aunque deshabilito esta regla particular de FxCop al usar contratos de código. Creo que el verificador estático compensa con creces la pérdida de esta regla, ya que gritará acerca de la falta de verificación mucho más agresiva que FxCop. Sugeriría el mismo enfoque aquí que solucionará este problema para usted.
Sí, como se indicó en mi respuesta aquí , a partir de la versión 4.5.2 del marco (posiblemente 4.5) es posible informar al Análisis de Código de los Contratos de Código que se aplican. Un método de extensión y una clase de atributo de marcador deben definirse así:
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 {}
Detalles adicionales están en mi otra respuesta.