溢流检查不工作
本文关键字:工作 检查 | 更新日期: 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。