Ostrzeżenie C6394
Tabela odnośników o rozmiarze 365 nie jest wystarczająca do obsługi lat przestępnych
Ta reguła została dodana w programie Visual Studio 2022 17.8.
Uwagi
W kalendarzu gregoriańskim każdy rok dokładnie dzielący przez cztery jest rokiem przestępnym — z wyjątkiem lat, które są dokładnie podzielne przez 100. Lata centurialne są również lat przestępnych, jeśli są dokładnie podzielne przez 400.
Błąd roku przestępnego występuje, gdy oprogramowanie nie uwzględnia tej logiki roku przestępnego lub używa wadliwej logiki. Może to mieć wpływ na niezawodność, dostępność, a nawet bezpieczeństwo systemu, którego dotyczy problem.
Tabele odnośników o rozmiarze 365 są często używane do szybkiego znajdowania miesiąca, do którego odpowiada dany dzień itd. Nie jest to jednak poprawne, ponieważ rok przestępny ma 366 dni.
Nazwa analizy kodu: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE
Przykład
Poniższy kod tworzy tabelę odnośników dla dnia roku, ale zakłada, że istnieje 365 dni rocznie. Jednak powoduje to nieprawidłowy wynik lub może spowodować niedostępny dostęp do tabeli odnośników, jeśli rok jest rokiem przestępnym:
#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.
}
Aby rozwiązać ten problem, dostosuj rozmiar tabeli odnośników w miarę tworzenia tabeli zgodnie z wynikiem sprawdzania roku przestępnego:
#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...
}
Algorytmy heurystyczne
Ta reguła jest wymuszana przez sprawdzenie, czy tabela odnośników ma początkowy rozmiar 365 elementów, ale można je rozszerzyć do 366. Jednak nie sprawdza, czy rozmiar tabeli jest dostosowywany przez odpowiednie sprawdzanie roku przestępnego, czy nie, i tak jest ostrzeżeniem o niskiej pewności.