Waarschuwing C6394
Een opzoektabel van grootte 365 is niet voldoende om schrikkeljaren te verwerken
Deze regel is toegevoegd in Visual Studio 2022 17.8.
Opmerkingen
In de Gregoriaanse kalender is een jaar dat precies deelbaar is door vier een schrikkeljaar, met uitzondering van de jaren die precies deelbaar zijn door 100. De eeuwjaren zijn ook schrikkeljaren als ze precies deelbaar zijn door 400.
Er treedt een schrikkeljaarfout op wanneer software geen rekening houdt met deze schrikkeljaarlogica of gebruikmaakt van gebrekkige logica. Dit kan van invloed zijn op de betrouwbaarheid, beschikbaarheid of zelfs de beveiliging van het getroffen systeem.
Opzoektabellen van grootte 365 worden vaak gebruikt om snel de maand van een bepaalde dag te vinden, enzovoort. Het is echter niet juist omdat een schrikkeljaar 366 dagen heeft.
Naam van codeanalyse: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE
Voorbeeld
Met de volgende code wordt een opzoektabel gemaakt voor de dag van het jaar, maar wordt ervan uitgegaan dat er 365 dagen per jaar zijn. Dit levert echter een verkeerd resultaat op of kan leiden tot toegang buiten de grenzen van de opzoektabel als het jaar een schrikkeljaar is.
#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.
}
U kunt dit probleem oplossen door de grootte van de opzoektabel aan te passen wanneer de tabel wordt gemaakt op basis van het resultaat van een schrikkeljaarcontrole:
#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...
}
Heuristiek
Deze regel wordt afgedwongen door te controleren of een opzoektabel een initiƫle grootte van 365 elementen heeft, maar kan worden uitgebreid naar 366. Er wordt echter niet gecontroleerd of de grootte van de tabel is aangepast door de juiste schrikkeljaarcontrole, en daarom wordt er een waarschuwing met lage betrouwbaarheid gegeven.