Partager via


Avertissement C6394

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é, et ainsi de suite. 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_MUTABLE

Exemple

Le code suivant crée une table de recherche pour le jour de l’année, mais suppose qu’il y a 365 jours par année. Toutefois, cela produit un résultat incorrect ou peut entraîner un accès hors limites de la table de recherche, si l’année est une année bissextile :

#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.
}

Pour résoudre ce problème, ajustez la taille de la table de recherche à mesure que la table est créée en fonction du résultat d’une année bissextile 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 a une taille initiale de 365 éléments, mais peut être étendue à 366. Toutefois, elle n’case activée pas si la taille de la table est ajustée au cours de l’année bissextile appropriée case activée ou non, et il s’agit donc d’un avertissement de confiance faible.

Voir aussi

C6393
C26861
C26862
C26863
C26864