Megosztás a következőn keresztül:


Figyelmeztetés C6394

A 365-ös méretű keresőtáblák nem elegendőek a szökőévek kezeléséhez

Ez a szabály a Visual Studio 2022 17.8-ban lett hozzáadva.

Megjegyzések

A Gergely-naptárban minden év pontosan négyel osztható szökőév - kivéve azokat az éveket, amelyek pontosan 100-tal oszthatóak. Az évszázados évek szökőévek is, ha pontosan 400-ra oszthatóak.

Szökőévi hiba akkor fordul elő, ha a szoftver nem veszi figyelembe ezt a szökőévi logikát, vagy hibás logikát használ. Ez hatással lehet a megbízhatóságra, a rendelkezésre állásra vagy akár az érintett rendszer biztonságára is.

A 365-ös méretű keresőtáblák gyakran arra szolgálnak, hogy gyorsan megtalálják az adott napnak megfelelő hónapot, és így tovább. Ez azonban nem helyes, mert egy szökőévnek 366 napja van.

Kódelemzés neve: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE.

Példa

Az alábbi kód létrehoz egy keresési táblát az év napjára, de feltételezi, hogy évente 365 nap van. Ez azonban rossz eredményt ad, vagy a keresési tábla korláton kívüli elérését okozhatja, ha az év szökőév:

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

A probléma megoldásához módosítsa a keresési tábla méretét, mivel a tábla létrehozása egy szökőév-ellenőrzés eredménye alapján történik:

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

Heurisztika

Ezt a szabályt úgy kényszeríti ki a rendszer, hogy ellenőrzi, hogy egy keresési tábla kezdeti mérete 365 elem-e, de 366-ra bővíthető. Azonban nem ellenőrzi, hogy a táblázat mérete megfelelő szökőév-ellenőrzéssel van-e módosítva, és ez is alacsony megbízhatósági figyelmeztetés.

Lásd még:

C6393
C26861
C26862
C26863
C26864