Advertencia C26862
Se ha creado un objeto
var
de fecha y hora a partir de un tipo diferente de objeto de fecha y hora, pero la conversión estaba incompleta:expr
Esta regla se agregó en Visual Studio 2022 17.8.
Comentarios
El cumplimiento adecuado de las reglas de control de año bisiesto y día bisiesto requieren el seguimiento de la conversión adecuada entre objetos de fecha y hora de diferentes tipos, como la estructura de Windows SYSTEMTIME
y la estructura de C tm
. Los distintos tipos de fecha y hora pueden tener bases diferentes para los campos año, mes y día. Por ejemplo, SYSTEMTIME
tiene un año basado en 0, pero campos de mes y día basados en 1. Por otro lado, tm
tiene un año basado en 1900, un mes basado en 0 y un campo de día basado en 1. Para convertir un objeto de uno de estos tipos en un objeto de otro tipo, los campos year, month y day deben ajustarse adecuadamente.
Nombre de análisis de código: INCOMPLETE_DATETIME_CONVERSION
Ejemplo
El código siguiente intenta convertir una instancia de tm
en una instancia de SYSTEMTIME
. Realiza el ajuste necesario en el campo año, pero no ajusta correctamente el campo mes:
#include <Windows.h>
#include <ctime>
void ConvertTmToSystemTime1b(const tm& tm)
{
SYSTEMTIME st;
st.wYear = tm.tm_year + 1900;
st.wMonth = tm.tm_mon; // C26862, Adjustment is missing
st.wDay = tm.tm_mday;
}
Para corregir este problema, ajuste los campos mes y año:
#include <Windows.h>
#include <ctime>
void ConvertTmToSystemTime(const tm& tm)
{
SYSTEMTIME st;
st.wYear = tm.tm_year + 1900;
st.wMonth = tm.tm_mon + 1;
st.wDay = tm.tm_mday;
}
Heurística
Esta regla solo reconoce la estructura de Windows SYSTEMTIME
y la estructura de C tm
.
Esta regla es una regla de participación, lo que significa que el análisis de código debe usar un archivo de conjunto de reglas y la regla debe incluirse explícitamente en el archivo del conjunto de reglas y habilitarla para que se aplique. Para obtener más información sobre cómo crear un conjunto de reglas personalizado para el análisis de código, vea Usar conjuntos de reglas para especificar las C++
reglas que se van a ejecutar.