2015-06-18 10 views
37

Perché viene visualizzato il seguente avviso per questo esempio di codice banale non appena il livello di avviso si trova al 2 ° livello o superiore?Falso positivo: la precondizione è ridondante

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

CodeContracts: suggerite richiede: Questo presupposto è ridondante: consideri rimuoverlo. Stai confrontando un valore di struct con null?

Chiaramente un numero intero può essere negativo, quindi la precondizione è difficilmente ridondante, quindi perché viene visualizzato questo avviso?

Edit: Ecco cosa ILSpy mostra per la funzione creata quando guardando l'exe:

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

Code Contracts settings

+1

Da dove si utilizza 'B' nella funzione? –

+0

@Lakshay Niente affatto in questa versione ridotta. Ma rimuoverlo non rimuove il suggerimento. Appena trascurato quando si crea un esempio minimo, rimosso. – Voo

+0

Sei sicuro che questo è il codice esatto? Potrebbe essere che il confronto venga eseguito su un numero intero senza segno, ad esempio?Puoi controllare l'IL che questo genera? – Luaan

risposta

2

So che questo non risponde direttamente alla tua domanda, ma sembra che sei utilizzando una modalità legacy per i Contratti di codice.

Questo documento descrive la modalità di assemblaggio raccomandata in base alle esigenze di utilizzo:

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

Da Pagine 20, 21 ...

assembly mode usage guidelines

Un altro frammento dal documento:

5.1.1 Ass incorporare la modalità

Gli strumenti del contratto devono sapere quale modalità di utilizzo si sceglie. Se si utilizza VisualStudio, selezionare la modalità assemby sul riquadro delle proprietà del contratto come segue:

  • Uso 1 o 2: Contratto standard richiede
  • Uso 3: personalizzato convalida dei parametri

Questo permette gli strumenti emettere avvisi appropriati quando si violano le linee guida sull'utilizzo. Se si utilizzano gli strumenti dalla riga di comando, passare l'argomento appropriato per l'opzione -assemblyMode

Quindi, utilizzando "Contratto standard richiede" modalità di montaggio si potrebbe fare una delle seguenti operazioni:

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

Nessuno di questi genera alcun avviso per me.

Spero che questo aiuti comunque.

Acclamazioni peteski