Sdílet prostřednictvím


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í.

Viz také

C6394
C26861
C26862
C26863
C26864