分享方式:


警告 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,以強制執行此規則。 不過,它不會檢查資料表的大小是否透過適當的閏年檢查來調整,因此是低信賴度警告。

另請參閱

C6393
C26861
C26862
C26863
C26864