2013-01-17 143 views
2

我有以下的有60000一數目的乘積來分鐘轉換成毫秒的代碼。我已經實現了溢出檢查,如下所示。我仍然在進行下面的代碼分析交戰。如何克服這個警告而不壓制它?溢出檢查不工作

警告:CA2233:更正在操作中的潛在溢出 'sessionExpiryValueInMinutes * 60' 'ApplicationSessionDAL.IsSessionExpired(短)'

注:TimeSpan.TotalMilliseconds Propertydouble數據類型

代碼

public void IsSessionExpired(Int16 sessionExpiryValueInMinutes) 
    { 

     if (sessionExpiryValueInMinutes > (double.MaxValue)/60000) 
     { 
      //Overflow check 
      throw new ArgumentOutOfRangeException("sessionExpiryValueInMinutes"); 
     } 
     else 
     { 
      //int milliSecondsValue = sessionExpiryValueInMinutes * 60 * 1000; 

      DateTime lastAccessTime = new DateTime(2013, 1, 1); 
      TimeSpan elapsedTime = (DateTime.Now - lastAccessTime); 
      if (elapsedTime.TotalMilliseconds > (sessionExpiryValueInMinutes * 60 * 1000)) 
      { 
       bool isTimeExpired = true; 
      } 

     } 

    } 

個參考

  1. Why is FxCop warning about an overflow (CA2233) in this C# code?
+0

的FxCop不能告訴你已檢查了溢出。它不是聰明的。 – Oded

+0

@Oded某些時候它可以工作,例如,添加時。當我們指定範圍檢查時,它停止抱怨警告。我找 – Lijo

+0

如果您要檢查Int16.MaxValue代替double.MaxValue這樣的解決方案? –

回答

5

,你可以換你的計算在checked塊。這樣,該計劃將明確地拋出一個System.OverflowException,你可以趕上做你想做的事。而且,既然你想拋出一個異常,在你的特定情況下,你不需要做其他事情。

例子:

checked 
{ 
    if (elapsedTime.TotalMilliseconds > (sessionExpiryValueInMinutes * 60 * 1000)) 
    { 
     bool isTimeExpired = true; 
    } 
} 

而且@Oded是正確的,的FxCop不能總是那麼聰明。

0

我不知道,但我懷疑這意味着結果(sessionExpiryValueInMinutes * 60 * 1000)將永遠不會抱進一個Int16的。

我看到您的代碼的另一個問題:我幾乎可以肯定,作爲Int16的sessionExpiryValueInMinutes永遠不會比(double.MaxValue)/ 60000更大。