Avertissement C6393
Une table de recherche de taille 365 n’est pas suffisante pour gérer les années bissextiles
Cette règle a été ajoutée dans Visual Studio 2022 17.8.
Notes
Dans le calendrier grégorien, chaque année exactement divisible par quatre est une année bissextile, à l’exception des années qui sont exactement divisibles par 100. Les années centuriales sont aussi des années bissextiles si elles sont exactement divisibles par 400.
Un bogue de l’année bissextile se produit lorsque le logiciel ne tient pas compte de cette logique de l’année bissextile ou utilise une logique défectueuse. Cela peut affecter la fiabilité, la disponibilité ou même la sécurité du système concerné.
Les tables de recherche de taille 365 sont souvent utilisées pour trouver rapidement le mois auquel correspond un jour donné. Toutefois, il n’est pas correct parce qu’une année bissextile a 366 jours.
Nom de l’analyse du code : LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP
Exemple
Le code suivant crée une table de recherche pour le jour de l’année, en supposant 365 jours par année. Toutefois, cela ne fonctionne pas si l’année est une année bissextile :
#include <vector>
void foo(int year)
{
const std::vector<int> items(365); // C6393
// Initialize items and use it...
}
Pour résoudre le problème, ajustez la taille de la table de recherche à mesure que la table est créée en fonction du résultat de l’année bissextile appropriée case activée :
#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...
}
Heuristique
Cette règle est appliquée par case activée ing si une table de recherche constante est dimensionnée pour 365 éléments. La violation de cette règle entraîne le signalement d’un avertissement de confiance élevée.