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. この C# コードでオーバーフロー (CA2233) に関する FxCop 警告が表示されるのはなぜですか?
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 に決して保持されないことを意味していると思われます。

あなたのコードには別の問題があります。Int16 である sessionExpiryValueInMinutes が (double.MaxValue)/60000 を超えることはないとほぼ確信しています。

于 2013-01-17T11:07:27.010 に答える