Advertencia C6394
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 se corresponde un día determinado, etc. 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_MUTABLE
Ejemplo
El código siguiente crea una tabla de búsqueda para el día del año, pero supone que hay 365 días al año. Sin embargo, esto produce el resultado incorrecto o puede provocar un acceso fuera de límite de la tabla de búsqueda, si el año es un año bisiesto:
#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.
}
Para corregir este problema, ajuste el tamaño de la tabla de búsqueda a medida que se crea la tabla según el resultado de una comprobación de año bisiesto:
#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 tiene un tamaño inicial de 365 elementos, pero se puede expandir a 366. Sin embargo, no comprueba si el tamaño de la tabla se ajusta a través de la comprobación de año bisiesto adecuada o no, y por lo tanto es una advertencia de confianza baja.