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.