Avviso C6393
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. Tuttavia, non è corretto perché un anno bisestile ha 366 giorni.
Nome dell'analisi del codice: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Esempio
Il codice seguente crea una tabella di ricerca per il giorno dell'anno, presupponendo 365 giorni all'anno. Tuttavia, questo non funziona se l'anno è un anno bisestile:
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Per risolvere il problema, modificare le dimensioni della tabella di ricerca man mano che la tabella viene creata in base al risultato del controllo dell'anno bisestile appropriato:
#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 costante viene ridimensionata per 365 elementi. La violazione di questa regola causa la segnalazione di un avviso di attendibilità elevata.