警告 C6394
大小為 365 的查閱表格不足以處理閏年
此規則已在 Visual Studio 2022 17.8 中新增。
備註
在西曆中,每年只有四分之一的可分割是一個閏年,除了 100 年完全可見的年份。 百年也是閏年,如果他們完全被400分分。
當軟體不考慮這個閏年邏輯,或使用有缺陷的邏輯時,就會發生閏年錯誤。 可能會影響受影響系統的可靠性、可用性,甚至是安全性。
大小為 365 的查閱表格通常用來快速尋找指定日期的月份,依此對應等等。 不過,不正確,因為閏年有 366 天。
程式碼分析名稱: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE
範例
下列程式碼會為一年中的日期建立查閱表格,但假設每年有 365 天。 不過,如果年份是閏年,這會產生錯誤的結果,或可能會導致查閱表格的界限外存取:
#include <vector>
void foo(int year)
{
std::vector<int> items(365); // C6394
// Initialize items and use it...
// Another item may be added to the vector if year is a leap year, but this
// rule doesn't check if that is the case.
}
若要修正此問題,請根據閏年檢查的結果建立資料表,調整查閱表格的大小:
#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 個專案,但可以展開至 366,以強制執行此規則。 不過,它不會檢查資料表的大小是否透過適當的閏年檢查來調整,因此是低信賴度警告。