Partager via


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 la vérification appropriée de l’année bissextile :

#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 en vérifiant 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.

Voir aussi

C6394
C26861
C26862
C26863
C26864