uso software prueba programacion proceso precondiciones precondicion postcondición postcondicion ingenieria contratos condiciones comunicación caso c# .net visual-studio-2013 static-analysis code-contracts

c# - prueba - precondiciones software



Falso positivo: la precondición es redundante (1)

¿Por qué recibo la siguiente advertencia para este ejemplo de código trivial tan pronto como el nivel de advertencia se encuentre en el segundo nivel o más?

public int Foo(int a) { if (a >= 0) throw new ArgumentException("a should be negative", "a"); Contract.EndContractBlock(); return a; }

CodeContracts: Sugerido requiere: Esta condición previa es redundante: Considere eliminarla. ¿Estás comparando un valor de estructura a nulo?

Claramente, un número entero puede ser negativo, por lo que la condición previa no es redundante, entonces ¿por qué recibo esta advertencia?

Editar: Esto es lo que ILSpy muestra para la función creada al mirar el archivo ejecutable:

public int Foo(int a) { if (a >= 0) { ContractHelper.RaiseContractFailedEvent(ContractFailureKind.Precondition, null, "a < 0", null); throw new ArgumentException("a should be negative", "a"); } return a; }


Sé que esto no responde directamente a su pregunta, pero parece que está utilizando un modo heredado para Contratos de código.

Este documento describe el modo de ensamblaje recomendado en función de los requisitos de uso:

http://research.microsoft.com/en-us/projects/contracts/userdoc.pdf

De las páginas 20, 21 ...

Otro fragmento del documento:

5.1.1 Modo de montaje

Las herramientas de contrato necesitan saber qué modo de uso eliges. Si usa VisualStudio, seleccione el Modo de ensamblaje en el panel de propiedades del contrato de la siguiente manera:

  • Uso 1 o 2: el contrato estándar requiere
  • Uso 3: Validación de parámetros personalizados

Esto permite que las herramientas emitan advertencias adecuadas cuando viola las pautas de uso. Si usa las herramientas de la línea de comandos, pase el argumento adecuado para la opción -assemblyMode

Entonces, si usa el modo de ensamblaje "Requiere contrato estándar", puede hacer lo siguiente:

Contract.Requires<ArgumentException>(a < 0, "a"); // OR Contract.Requires(a < 0, "a should be negative");

Ninguno de estos genera ninguna advertencia para mí.

Espero que esto ayude de todos modos.

Cheers peteski