警告 C6393
大小為 365 的查閱表格不足以處理閏年
此規則已在 Visual Studio 2022 17.8 中新增。
備註
在西曆中,每年只有四分之一的可分割是一個閏年,除了 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 個專案來強制執行。 違反此規則會導致報告高信賴度警告。