Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
En uppslagstabell med storlek 365 räcker inte för att hantera skottår
Anmärkningar
Den här regeln lades till i Visual Studio 2022 17.8.
I den gregorianska kalendern är varje år exakt delbar med fyra ett skottår - förutom för år som är exakt delbara med 100. De centuriala åren är också skottår om de är exakt delbara med 400.
Ett skottårsfel inträffar när programvara inte tar hänsyn till den här skottårslogik eller använder felaktig logik. Kan påverka tillförlitlighet, tillgänglighet eller till och med säkerheten i det berörda systemet.
Uppslagstabeller med storlek 365 används ofta för att snabbt hitta den månad som en viss dag motsvarar och så vidare. Det är dock inte korrekt eftersom ett skottår har 366 dagar.
Namn på kodanalys: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE
Example
Följande kod skapar en uppslagstabell för dagen på året, men förutsätter att det finns 365 dagar per år. Detta ger dock fel resultat, eller kan orsaka åtkomst utanför gränserna för uppslagstabellen, om året är ett skottår:
#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.
}
Åtgärda problemet genom att justera storleken på uppslagstabellen när tabellen skapas enligt resultatet av en skottårskontroll:
#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...
}
Heuristik
Den här regeln tillämpas genom att kontrollera om en uppslagstabell har en ursprunglig storlek på 365 element, men kan utökas till 366. Det kontrollerar dock inte om tabellens storlek justeras genom korrekt skottårskontroll eller inte, och det är också en varning med låg konfidens.