2014-10-09 17 views
12

Mam bardzo prostą klasę wykorzystania umów kodu .NET:Dlaczego analiza statyczna ignoruje podwójne <= and > = wymaganie?

public class ContractSquareRoot 
{ 
    /// <summary> 
    /// Makes your life much easier by calling Math.Sqrt for you. Ain't that peachy. 
    /// </summary> 
    /// <param name="value">The value to calculate the square root from. No negatives!</param> 
    /// <returns>The square root of the given value. Obviously always > 0.</returns> 
    public double CalculateSquareRoot(double value) 
    { 
     Contract.Requires<ArgumentException>(0 <= value); 
     Contract.Ensures(0 <= Contract.Result<double>()); 

     double squareRoot = Math.Sqrt(value); 

     return squareRoot; 
    } 
} 

Kiedy wywołać metodę z wartością ujemną, spodziewam statycznej analizy kodu, by ostrzegać mnie o tym.

class Program 
{ 
    static void Main(string[] args) 
    { 

     var barMansSquareroot = new ContractSquareRoot(); 

     // This should not be possible... 
     barMansSquareroot.CalculateSquareRoot(-42); 

    } 
} 

Ale nawet jeśli Contract.Requires nie rzuca żądany wyjątek, statyczna analiza kodu oznacza każde twierdzenie prawidłowe. Co ciekawe, ostrzega mnie przed naruszeniem, gdy zmienię typ wartości na int lub jeśli zmienię <= na <. Zachowanie jest ograniczone do double i float. Zakładam, że ma to coś wspólnego z precyzją wartości zmiennoprzecinkowych.

Działa nawet kiedy formułuje wymóg takiego:

Contract.Requires<ArgumentException>(!(0 > value)); 

Czy to bug czy ja robię coś źle?

+0

Po prostu nie interesuje Cię, dlaczego nie pozwolisz 0 jako prawidłowej wartości? – thumbmunkeys

+0

Chcę, aby wartość 0 była dozwolona. umowa powinna zapewnić, że każda wartość wynosi> = 0. – vlow

+2

Zdecydowanie interesujące, spróbuję skontaktować się z Francesco, https://visualstudiogallery.msdn.microsoft.com/1ec7db13-3363-46c9-851f-1ce455f66970 –

Odpowiedz

1

Mam nadzieję, że nie udało Ci się zainstalować umowy Microsoft Code.

Można pobrać Kontrakty Kod Microsoft z Microsoft Research: http://research.microsoft.com/en-us/projects/contracts/

Teraz na swoje właściwości projektu dostaniesz dodatkową kartę w którym można ustawić czas pracy i kontroli statycznej.

+0

proszę odnieść się do tego w celu uzyskania dodatkowych informacji https://www.de.info/csharpcodecontracts – Joseph

+0

Joseph, poprawnie zainstalowałem Contract Contracts. Jak widzisz w moim pytaniu, umowy kodowe działają ogólnie i po prostu nie działają w konkretnym przypadku wspomnianym powyżej. – vlow

Powiązane problemy