Warnung C6394

Eine Nachschlagetabelle mit Größe 365 reicht nicht aus, um Schaltjahre zu bewältigen.

Diese Regel wurde in Visual Studio 2022 17.8 hinzugefügt.

Hinweise

Im gregorianischen Kalender ist jedes Jahr ein Schaltjahr, mit Ausnahme von Jahren, die genau durch 100 divisierbar sind. Die centurialen Jahre sind auch Schaltjahre, wenn sie genau um 400 teilbar sind.

Ein Schaltjahrfehler tritt auf, wenn Software diese Schaltjahrlogik nicht berücksichtigt oder fehlerhafte Logik verwendet. Dies kann sich auf Zuverlässigkeit, Verfügbarkeit oder sogar die Sicherheit des betroffenen Systems auswirken.

Nachschlagetabellen mit Größe 365 werden häufig verwendet, um den Monat schnell zu finden, dem ein bestimmter Tag entspricht usw. Es ist jedoch nicht richtig, weil ein Schaltjahr 366 Tage hat.

Codeanalysename: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE

Beispiel

Mit dem folgenden Code wird eine Nachschlagetabelle für den Tag des Jahres erstellt, es wird jedoch davon ausgegangen, dass es 365 Tage pro Jahr gibt. Dies führt jedoch zu einem falschen Ergebnis oder kann einen nicht gebundenen Zugriff auf die Nachschlagetabelle verursachen, wenn das Jahr ein Schaltjahr ist:

#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.
}

Um dieses Problem zu beheben, passen Sie die Größe der Nachschlagetabelle an, während die Tabelle gemäß dem Ergebnis einer Schaltjahrüberprüfung erstellt wird:

#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... 
}

Heuristik

Diese Regel wird erzwungen, indem überprüft wird, ob eine Nachschlagetabelle eine Anfangsgröße von 365 Elementen aufweist, aber auf 366 erweitert werden kann. Es wird jedoch nicht überprüft, ob die Größe der Tabelle durch die richtige Schaltjahrüberprüfung angepasst wird oder nicht, und dies ist eine Warnung mit niedriger Konfidenz.

Siehe auch

C6393
C26861
C26862
C26863
C26864