溢流检查不工作

本文关键字:工作 检查 | 更新日期: 2023-09-27 17:54:03

我有以下代码,其中有一个数字与60000的乘法,将分钟转换为毫秒。我已经实现了一个溢出检查,如下所示。我还得到了下面的代码分析交战。如何在不压制这种警告的情况下克服它?

警告:CA2233:纠正' applicationsessiondl . issessionexpired (short)'操作'sessionExpiryValueInMinutes*60'中的潜在溢出

注意:时间间隔。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;
            }
        }
    }

引用

    为什么FxCop在这个c#代码中警告溢出(CA2233) ?

溢流检查不工作

你可以在checked块中封装你的计算。这样,程序将显式抛出一个System.OverflowException,你可以在这里捕获它来做你想做的事情。既然你想抛出一个异常,在你的特殊情况下,你不需要做任何其他的事情。

的例子:

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

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

我不确定,但我怀疑这意味着(sessionExpiryValueInMinutes * 60 * 1000)的结果将永远不会进入Int16。

我看到你的代码的另一个问题:我几乎可以肯定,sessionExpiryValueInMinutes,作为一个Int16,将永远不会大于(double.MaxValue)/60000。