Aviso C26862
Um objeto date-time foi criado a partir de um tipo diferente de objeto
var
date-time, mas a conversão foi incompleta:expr
Essa regra foi adicionada no Visual Studio 2022 17.8.
Comentários
A aplicação adequada de regras de manipulação de ano bissexto e dia bissexto requer o controle da conversão adequada entre objetos de data-hora de diferentes tipos, como a struct do Windows SYSTEMTIME
e a struct C tm
. Diferentes tipos de data-hora podem ter bases diferentes para os campos ano, mês e dia. Por exemplo, tem um ano baseado em 0, SYSTEMTIME
mas campos de mês e dia com base em 1. Por outro lado, tem um ano baseado em 1900, tm
um mês baseado em 0 e um campo de dia baseado em 1. Para converter um objeto de um desses tipos em um objeto de outro tipo, os campos ano, mês e dia devem ser ajustados adequadamente.
Nome da análise de código: INCOMPLETE_DATETIME_CONVERSION
Exemplo
O código a seguir tenta converter uma instância de em uma instância de tm
SYSTEMTIME
. Ele faz o ajuste necessário no campo ano, mas não ajusta corretamente o campo mês:
#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 corrigir esse problema, ajuste os campos de mês e ano:
#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 regra só reconhece a struct do Windows SYSTEMTIME
e a estrutura C tm
.
Essa regra é uma regra de aceitação, o que significa que a análise de código deve usar um arquivo de conjunto de regras, e a regra deve ser explicitamente incluída no arquivo de conjunto de regras e habilitada para que seja aplicada. Para obter mais informações sobre como criar um conjunto de regras personalizado para análise de código, consulte Usar conjuntos de regras para especificar as C++
regras a serem executadas.