Warnung C6393

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, dem ein bestimmter Tag entspricht, schnell zu finden. Es ist jedoch nicht richtig, weil ein Schaltjahr 366 Tage hat.

Codeanalysename: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP

Beispiel

Der folgende Code erstellt eine Nachschlagetabelle für den Tag des Jahres, wobei 365 Tage pro Jahr vorausgesetzt werden. Dies funktioniert jedoch nicht, wenn das Jahr ein Schaltjahr ist:

 
#include <vector> 
  
void foo(int year) 
{ 
    const std::vector<int> items(365);  // C6393 
    // Initialize items and use it... 
}

Um das Problem zu beheben, passen Sie die Größe der Nachschlagetabelle an, wenn die Tabelle gemäß dem Ergebnis der entsprechenden 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 konstante Nachschlagetabelle für 365 Elemente angepasst wird. Verstoß gegen diese Regel bewirkt, dass eine Warnung mit hoher Vertrauenswürdigkeit gemeldet wird.

Siehe auch

C6394
C26861
C26862
C26863
C26864