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. Det är dock inte korrekt eftersom ett skottår har 366 dagar.
Namn på kodanalys: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Example
Följande kod skapar en uppslagstabell för dagen på året, förutsatt 365 dagar per år. Detta fungerar dock inte om året är ett skottår:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Åtgärda problemet genom att justera storleken på uppslagstabellen när tabellen skapas enligt resultatet av lämplig 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 konstant uppslagstabell är storleksanpassad för 365 element. Brott mot den här regeln gör att en varning med hög konfidens rapporteras.