Compartir a través de


Advertencia C6393

Una tabla de búsqueda de tamaño 365 no es suficiente para controlar años bisiestos

Esta regla se agregó en Visual Studio 2022 17.8.

Comentarios

En el calendario gregoriano, cada año exactamente divisible por cuatro es un año bisiesto, excepto por años que son exactamente divisibles en 100. Los siglos también son años bisiestos si son exactamente divisibles en 400.

Se produce un error de año bisiesto cuando el software no tiene en cuenta esta lógica de año bisiesto o usa lógica errónea. puede afectar a la confiabilidad, disponibilidad o incluso a la seguridad del sistema afectado.

Las tablas de búsqueda de tamaño 365 a menudo se usan para encontrar rápidamente el mes al que corresponde un día determinado. Sin embargo, no es correcto porque un año bisiesto tiene 366 días.

Nombre de análisis de código: LEAP_YEAR_INVALID_DATE_KEYED_LOOKUP

Ejemplo

El código siguiente crea una tabla de búsqueda para el día del año, suponiendo 365 días al año. Sin embargo, esto no funciona si el año es un año bisiesto:

 
#include <vector> 
  
void foo(int year) 
{ 
    const std::vector<int> items(365);  // C6393 
    // Initialize items and use it... 
}

Para corregir el problema, ajuste el tamaño de la tabla de búsqueda a medida que se crea la tabla según el resultado de la comprobación de año bisiesto adecuada:

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

Heurística

Esta regla se aplica comprobando si una tabla de búsqueda constante tiene un tamaño de 365 elementos. La infracción de esta regla hace que se notifique una advertencia de confianza alta.

Consulte también

C6394
C26861
C26862
C26863
C26864