Avviso C6394
Una tabella di ricerca di dimensioni 365 non è sufficiente per gestire gli anni bisestili
Questa regola è stata aggiunta in Visual Studio 2022 17.8.
Osservazioni:
Nel calendario gregoriano, ogni anno esattamente divisibile per quattro è un anno bisestile, ad eccezione degli anni che sono esattamente divisibile per 100. Gli anni centuriali sono anche bisestili se sono esattamente divisibili per 400.
Un bug dell'anno bisestile si verifica quando il software non tiene conto di questa logica bisestile o usa logica difettosa. Può influire sull'affidabilità, la disponibilità o anche la sicurezza del sistema interessato.
Le tabelle di ricerca di dimensioni 365 vengono spesso usate per trovare rapidamente il mese a cui corrisponde un determinato giorno e così via. Tuttavia, non è corretto perché un anno bisestile ha 366 giorni.
Nome dell'analisi del codice: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP_MUTABLE
Esempio
Il codice seguente crea una tabella di ricerca per il giorno dell'anno, ma presuppone che siano presenti 365 giorni all'anno. Tuttavia, questo produce il risultato errato o può causare un accesso out-of-bounds della tabella di ricerca, se l'anno è bisestile:
#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.
}
Per risolvere questo problema, modificare le dimensioni della tabella di ricerca man mano che la tabella viene creata in base al risultato di un controllo bisestile:
#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...
}
Euristica
Questa regola viene applicata controllando se una tabella di ricerca ha una dimensione iniziale di 365 elementi, ma può essere espansa a 366. Tuttavia, non controlla se le dimensioni della tabella vengono modificate o meno tramite un controllo dell'anno bisestile appropriato e quindi è un avviso di bassa attendibilità.