Ostrzeżenie C6393
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, z którego odpowiada dany dzień. Nie jest to jednak poprawne, ponieważ rok przestępny ma 366 dni.
Nazwa analizy kodu: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Przykład
Poniższy kod tworzy tabelę odnośników dla dnia roku przy założeniu 365 dni rocznie. Nie działa to jednak, jeśli rok jest rokiem przestępnym:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Aby rozwiązać ten problem, dostosuj rozmiar tabeli odnośników w miarę tworzenia tabeli zgodnie z wynikiem odpowiedniego sprawdzenia 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 stałych ma rozmiar 365 elementów. Naruszenie tej reguły powoduje zgłaszanie ostrzeżenia o wysokim ufności.