警告 C6393
サイズ 365 のルックアップ テーブルでは、閏年を処理するには不十分です
この規則は、Visual Studio 2022 17.8 で追加されました。
解説
グレゴリオ暦では、毎年 4 で正確に割り切れる年は閏年です。ただし、100 で正確に割り切れる年を除きます。 百年も閏年は、400 で正確に割り切れる場合です。
閏年のバグは、ソフトウェアがこの閏年ロジックを考慮しない場合、または欠陥のあるロジックを使用する場合に発生します。 信頼性、可用性、または影響を受けるシステムのセキュリティに影響を与える可能性があります。
サイズ 365 のルックアップ テーブルは、多くの場合、特定の日が対応する月をすばやく見つけるために使用されます。 ただし、閏年には 366 日があるため、正しくありません。
コード分析名: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
例
次のコードでは、年間 365 日を想定して、その年の日の参照テーブルを作成します。 ただし、年が閏年の場合、これは機能しません。
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
この問題を解決するには、適切な閏年チェックの結果に従ってテーブルが作成されるときに参照テーブルのサイズを調整します。
#include <vector>
void foo(int year)
{
bool isLeapYear = year % 4 == 0 && (year % 100 != 0 || year % 400 == 0);
const std::vector<int> items(isLeapYear ? 366 : 365);
// Initialize items and use it...
}
ヒューリスティック
このルールは、定数参照テーブルのサイズが 365 要素に対して設定されているかどうかをチェックすることによって適用されます。 この規則に違反すると、信頼度の高い警告が報告されます。