Upozornění C6393
Vyhledávací tabulka o velikosti 365 nestačí ke zpracování přestupných let.
Toto pravidlo bylo přidáno v sadě Visual Studio 2022 17.8.
Poznámky
V gregoriánském kalendáři je každý rok přesně dělitelný čtyřmi lety - s výjimkou let, které jsou přesně dělitelné 100. Centurial roky jsou také přestupné roky, pokud jsou přesně dělitelné o 400.
K chybě přestupného roku dochází v případě, že software nebere v úvahu tuto logiku přestupného roku nebo používá chybnou logiku. Může mít vliv na spolehlivost, dostupnost nebo dokonce i na zabezpečení ovlivněného systému.
Vyhledávací tabulky o velikosti 365 se často používají k rychlému vyhledání měsíce odpovídajícího danému dni. Není to ale správné, protože přestupný rok má 366 dní.
Název analýzy kódu: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Příklad
Následující kód vytvoří vyhledávací tabulku pro den v roce za předpokladu, že 365 dní za rok. To ale nefunguje, pokud je rok přestupný rok:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Pokud chcete tento problém vyřešit, upravte velikost vyhledávací tabulky tak, jak se tabulka vytvoří, podle výsledku odpovídající kontroly přestupného roku:
#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...
}
Heuristika
Toto pravidlo se vynucuje kontrolou velikosti konstantní vyhledávací tabulky pro 365 prvků. Porušení tohoto pravidla způsobí nahlášení upozornění s vysokou spolehlivostí.