Sdílet prostřednictvím


Upozornění C6394

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 atd. 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_MUTABLE

Příklad

Následující kód vytvoří vyhledávací tabulku pro den v roce, ale předpokládá se, že existuje 365 dní v roce. Výsledkem je ale nesprávný výsledek nebo může způsobit přístup k vyhledávací tabulce mimo hranice, pokud je rok přestupným rokem:

#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.
}

Chcete-li tento problém vyřešit, upravte velikost vyhledávací tabulky tak, jak se tabulka vytvoří, podle výsledku 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, jestli má vyhledávací tabulka počáteční velikost 365 prvků, ale dá se rozšířit na 366. Nekontroluje ale, jestli je velikost tabulky upravena přes správnou kontrolu přestupového roku nebo ne, a proto je upozornění na nízkou spolehlivost.

Viz také

C6393
C26861
C26862
C26863
C26864