2

我有以下代码,将数字与 60000 相乘以将分钟转换为毫秒。我已经实现了溢出检查,如下所示。我仍然收到以下代码分析的警告。如何在不压制它的情况下克服这个警告?

警告:CA2233:更正“ApplicationSessionDAL.IsSessionExpired(short)”中操作“sessionExpiryValueInMinutes*60”中的潜在溢出

注意:TimeSpan.TotalMilliseconds 属性double数据类型

代码

    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. 为什么 FxCop 会在此 C# 代码中发出有关溢出 (CA2233) 的警告?
4

2 回答 2

5

您可以将计算包装在一个checked块中。这样,程序将显式抛出一个System.OverflowException你可以在这里捕获的东西来做你想做的事。而且由于您无论如何都想抛出异常,在您的特定情况下,您不需要做任何其他事情。

例子:

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

@Oded 是对的,FxCop 不可能总是那么聪明。

于 2013-01-17T11:00:17.240 回答
0

我不确定,但我怀疑这意味着 (sessionExpiryValueInMinutes * 60 * 1000) 的结果永远不会保留在 Int16 中。

我发现您的代码存在另一个问题:我几乎可以肯定 sessionExpiryValueInMinutes 作为 Int16,永远不会大于 (double.MaxValue)/60000。

于 2013-01-17T11:07:27.010 回答